2009-09-17 10 views
5

Podczas ładowania zewnętrznych bibliotek DLL (nie będących pod naszą kontrolą) za pomocą funkcji LoadLibrary, pojawia się problem polegający na tym, że statycznie połączony CRT w tych bibliotekach DLL nie może przydzielić lokalnej pamięci masowej. Jest to podobne do mskb 193462, z tym że jest to FLS i jest ich tylko 128.Praca z ograniczeniami dla fls ze zbyt wieloma statycznie połączonymi CRT?

Czy są jakieś przydatne sposoby na obejście problemu? CRT używa GetProcAddress do znalezienia FlsAlloc tak czy inaczej (ponieważ najwyraźniej nigdy nie istniało w XP), więc czy naprawdę tego potrzebuje?

(Jest to na Vista, gdzie FlsAlloc rzeczywiście istnieje; DLLe pojawiają się przy użyciu MSVC8)

Odpowiedz

2

Jest szczerze nie rozwiązanie tutaj, krótkie ładowanie mniej bibliotek DLL.

Możesz zahaczyć tabelę adresów importowych biblioteki DLL - ale stanie się to zbyt późno, ponieważ możesz zainstalować hak IAT tylko wtedy, gdy LoadLibrary wróci, a kod inicjujący CRT prawdopodobnie zostanie wykonany w odpowiedzi na DllProcessAttach, które już zostały przetworzone.

Można zgadnąć, znajdź moduł kernel32.dll w pamięci i popraw adres eksportu dla GetProcAddress lub być może FlsAlloc, aby wskazywał na implementację. Ale to podejście staje się poważnie hackish.

+0

Poszedł z tymczasowym rozwiązaniem wycinania rzeczy i mając nadzieję, że nie będziemy potrzebować zbyt wiele więcej :(Próba poprawienia FlsAlloc jest po prostu zbyt przerażająca, ale ponieważ większość z tych bibliotek jest ładowana w czasie wykonywania (przez LoadLibrary) prawdopodobnie jest to technicznie możliwy. – Mook

Powiązane problemy