Article View: pl.comp.lang.delphi
Article #334668Re: Przejęcie odwołania funkcji obsługi plików w DLL
From: Arivald
Date: Wed, 11 Jan 2012 11:18
Date: Wed, 11 Jan 2012 11:18
79 lines
4517 bytes
4517 bytes
W dniu 2012-01-10 18:04, xbary pisze: > Witam > > Mam pytanie do Szanownego Towarzystwa :) > Może bardziej jest to problemem ale już naświetlam o co mi chodzi. > > Piszę sobie program w Delphi 5 STD (stare ale jare), wykorzystuje w > nim bibliotekę DLL, a ta biblioteka oferuje mi taką funkcję do > wczytywania bitmapy z pliku bmp, load_bitmap(filename:PChar;):BITMAP; > zaznaczam że to jedyna możliwość wczytania bitmapy przez tą wspomnianą > bibliotekę. > Problem polega na tym że ową bitmapę chciałbym wczytać z jakiegoś > TStream lub bezpośrednio z pamięci... ??? > > Można to by zrobić to łopatologicznie i zapisywać w katalogu TEMP tą > bitmapę i wczytać normalnie, a następnie wymazać bmp zTEMP, ale to > klamizerstwo i w dodatku bardzo zwalnia operacje i naraża na proste > skopiowanie bmp... > > Jedyną możliwością byłoby zrobić tak żeby w bibliotece DLL > przekierować funkcje odczytu zapisu i otwierania plików na swoje > funkcje w programie i tak symulować odczyt że niby z dysku ale z > pamięci danej bitmapy. > > Czy jest na to jakiś myk? > szukałem trochę w sieci ale niema jasno i wyraźnie wyjaśnione jak > takie przejęcie zrobić.. > > Pozdrawiam > Piotr > Skoro inne sposoby zawiodły, a "bardzo bardzo bardzo" nie chcesz pliku w %TMP%, to możesz spróbować pakietu Detour z Microsoftu. http://research.microsoft.com/en-us/projects/detours/ Lub zamemu zakodować ich odpowiednik w Delphi, no tu przykładowy kod: http://stackoverflow.com/questions/6905287/how-to-change-the-implementation-detour-of-an-externally-declared-function Zobacz też do projektu Fastcode (http://www.fastcode.dk/fastcodeproject/fastcodeproject/index.htm), Jak oni podmieniają standardowe funkcje RTLa Delphi na szybsze wersje. Ogólnie polega to na podmianie pierwszych 5 bajtów instrukcji na skok bezwarunkowy do nowej implementacji. Znajomość assemblera i niskopoziomowych detali działania Delphi mocno wskazana ;-) Łatwiejsze jest przejmowanie wywołania metod wirtualnych i dynamicznych, bo tu wystarczy podmienić jedynie adres w VTABLE. A co do szczegółów rozwiązania, to zamiast modyfikować tą DLLkę, jak sugerował dziobu (...i zamieniasz wszystkie ciągi "kernel32.dll" na Twoje "kerneX32.dll"), możesz przejąć obsługę LoadLibrary() i załadować inną bibliotekę niż ta oczekiwana przez DLLkę. Przykład podobnego przejęcia widziałem w w jakimś projekcie przerobienia klienta bazodanowego do wersji "embedded" (chyba Firebird, ale głowy nie dam). W podmienionej wersji LoadLibrary odpowiednie DLLki były wypakowywane z zasobów exeka do TMP, tak że dla kodu klienckiego wyglądało to tak jak by ta DLLka była już zainstalowana w systemie). Możesz też nie bawić się w kopiowanie interfejsu kernel32.dll, a po prostu przejąć wywołania tych kilku funkcji API. Co do detali implementacji, to jeśli chodzi o DLL to dużo Ci nie pomogę, ja robiłem takie rzeczy tylko w kontekście własnego exeka (np poprawienie TBitmap o obsługę rysowania 32-bitowych bitmap z kanałem alpha, czy podmiana dialogu MessageBox'a na własny). A jeszcze zupełnie inną metoda rozwiązania problemu może być napisanie własnego sterownika, który systemowi będzie się przedstawiał jako pamięć masowa (dysk), a w rzeczywistości przekieruje wszystkie wywołania do Twojego kodu. Ale to kupa roboty... i kupa nauki ;-) -- Arivald
Technical Details
Message-ID:
<jejr5q$fo3$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<75934d7e-dc45-4c01-a2ac-36a9e13814b9@i6g2000vbk.googlegroups.com>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Arivald <arivald_@AT_interia_DOT_.pl> Newsgroups: pl.comp.lang.delphi Subject: Re: Przejęcie odwołania funkcji obsługi plików w DLL Date: Wed, 11 Jan 2012 12:18:18 +0100 Organization: Dialog Net Lines: 79 Message-ID: <jejr5q$fo3$1@news.dialog.net.pl> References: <75934d7e-dc45-4c01-a2ac-36a9e13814b9@i6g2000vbk.googlegroups.com> NNTP-Posting-Host: poczta.pgs-soft.com Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1326280698 16131 62.87.249.67 (11 Jan 2012 11:18:18 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Wed, 11 Jan 2012 11:18:18 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:9.0) Gecko/20111222 Thunderbird/9.0.1 In-Reply-To: <75934d7e-dc45-4c01-a2ac-36a9e13814b9@i6g2000vbk.googlegroups.com> X-Stationery: 0.7.7 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit