windows - løsningsfejl af LoadLibraryEx (..., LOAD\_LIBRARY\_SEARCH\_DLL\_LOAD\_DIR) loading wrong dll

Indlæg af Hanne Mølgaard Plasc

Problem



Situationen følger.
Disse dlls er indlæst i en proces:


c:abcfoo.dll
c:abcar.dll
c:zxcfoo.dll


Og processen er placeret i c:abc.
Jeg indlæser c:zxcar.dll. Det implicit linker til foo.dll. Og det skal linke til c:zxcfoo.dll, som er i samme mappe.
Jeg indlæser det med


LoadLibraryExA("c:\zxc\bar.dll", NULL, LOAD\_LIBRARY\_SEARCH\_DLL\_LOAD\_DIR)


Hvis c:abcfoo.dll ikke indlæses, bliver c:zxcfoo.dll korrekt indlæst og c:zxcar.dll links til den.
Men hvis c:abcfoo.dll er indlæst, linker c:\zxc\bar.dll til c:abcfoo.dll i stedet for c:zxcfoo.dll (selvom c:zxcfoo.dll allerede er indlæst i processen. Dette blev bekræftet med afkrydsningsfeltet 'Vis loader snaps' af Global Flags.


Hvordan arbejder jeg rundt om det?


bar.dll er tredjepart, så jeg kan ikke implementere DELAYLOAD i den.


Og jeg kan ikke forhindre indlæsning af c:abcfoo.dll til processen.


Jeg tænker på at hakke ntdll!LdrpFindOrMapDll, men det virker upåliteligt, og jeg bliver nødt til at teste dette grundigt i alle understøttede Windows-versioner, så jeg først søger efter en enklere løsning.

Bedste reference


Jeg tror, ​​du kan forsøge at gøre din foo.dll en side ved side forsamling, og referere den i din dll manifest.
Sådan skulle fælles kontrol af 5 og 6 versioner og Visual Studio forskellige C runtime versioner ligeledes eksistere i samme proces.


Hvis dette virker, behøver du ikke nødvendigvis at installere din foo.dll til WinSxS-mappe, måske kan du gøre med private forsamlinger.


Hvis side-by-side samlinger ikke virker for dig, så er enhver hooking løsning kompleks og risikabel.
Tænk på det: Antallet af opkald som GetModuleHandleW (L 'foo.dll') skulle returnere et rigtigt DLL-håndtag i hver sammenhæng!
(og side om side samlinger gør dette trick, hvis bar.dll kode er kompileret med ISOLATION\_AWARE\_ENABLED defineret)