🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #334668

Re: Przejęcie odwołania funkcji obsługi plików w DLL

#334668
From: Arivald
Date: Wed, 11 Jan 2012 11:18
79 lines
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-mail
References: <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