状況は次のとおりです。これらの dll はプロセスでロードされます。
c:\abc\foo.dll
c:\abc\bar.dll
c:\zxc\foo.dll
プロセスは にありc:\abc\
ます。読み込んc:\zxc\bar.dll
でいます。に暗黙的にリンクしfoo.dll
ます。c:\zxc\foo.dll
そして、同じフォルダにある にリンクする必要があります。私はそれをロードします
LoadLibraryExA("c:\\zxc\\bar.dll", NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)
c:\abc\foo.dll
がロードされていない場合は、c:\zxc\foo.dll
適切にロードされてc:\zxc\bar.dll
リンクされます。ただし、c:\abc\foo.dll
がロードされている場合は、代わりに にc:\\zxc\\bar.dll
リンクします(プロセスで既にロードされている場合でも)。これは、Global Flags の [Show loader snaps] チェックボックスを使用して確認されました。c:\abc\foo.dll
c:\zxc\foo.dll
c:\zxc\foo.dll
どうすれば回避できますか?
これbar.dll
はサードパーティであるため、DELAYLOAD を実装することはできません。
c:\abc\foo.dll
そして、プロセスへのロードを防ぐことはできません。
フックを考えてntdll!LdrpFindOrMapDll
いますが、信頼性がないようで、サポートされているすべての Windows バージョンでこれを徹底的にテストする必要があるため、最初はより簡単な回避策を探しています。