Article View: pl.comp.lang.delphi
Article #334669Re: Przejęcie odwołania funkcji obsługi plików w DLL
From: xbary
Date: Thu, 12 Jan 2012 11:26
Date: Thu, 12 Jan 2012 11:26
92 lines
5561 bytes
5561 bytes
On 11 Sty, 12:18, Arivald <arivald_@AT_interia_DOT_.pl> wrote: > 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-implemen... > > 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 Myślę że zastosuje sposób Dzioba, miałbym tam pare rzeczy do wyjaśnienia, a konkretnie wolałbym działający przykład na którąś funkcje, bo jakoś nie mogę poskładać tego w Delphi. Gdyby udało się coś takiego robić i na każdej platformie systemowej by to zadziałało to nawet można by się pokusić - stworzyć z tego jakieś narzędzie którego działanie polegałoby na tym że wskazywałoby się plik DLL który chcemy nabrać na inną DLL i zrobić możliwość wyboru która funkcja ma być podmieniona i możliwość generowania kodu źródłowego gotowego do skompilowania.
Technical Details
Message-ID:
<717842ae-0f93-4162-86e7-a6e925a3c182@do4g2000vbb.googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!do4g2000vbb.googlegroups.com!not-for-mailReferences:
<75934d7e-dc45-4c01-a2ac-36a9e13814b9@i6g2000vbk.googlegroups.com> <jejr5q$fo3$1@news.dialog.net.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!do4g2000vbb.googlegroups.com!not-for-mail From: xbary <xbary@wp.pl> Newsgroups: pl.comp.lang.delphi Subject: Re: Przejęcie odwołania funkcji obsługi plików w DLL Date: Thu, 12 Jan 2012 03:26:03 -0800 (PST) Organization: http://groups.google.com Lines: 120 Message-ID: <717842ae-0f93-4162-86e7-a6e925a3c182@do4g2000vbb.googlegroups.com> References: <75934d7e-dc45-4c01-a2ac-36a9e13814b9@i6g2000vbk.googlegroups.com> <jejr5q$fo3$1@news.dialog.net.pl> NNTP-Posting-Host: 83.23.68.2 Mime-Version: 1.0 X-Trace: posting.google.com 1326367563 18591 127.0.0.1 (12 Jan 2012 11:26:03 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Thu, 12 Jan 2012 11:26:03 +0000 (UTC) Complaints-To: groups-abuse@google.com Injection-Info: do4g2000vbb.googlegroups.com; posting-host=83.23.68.2; posting-account=YqNsWQoAAAA_7yhX7SRaVTGU6Fb5-oXn User-Agent: G2/1.0 X-Google-Web-Client: true X-Google-Header-Order: HUALESNKRC X-HTTP-UserAgent: Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1,gzip(gfe) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit