🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#334669
From: xbary
Date: Thu, 12 Jan 2012 11:26
92 lines
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-mail
References: <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