情况如下。这些 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
链接到c:\abc\foo.dll
而不是c:\zxc\foo.dll
(即使c:\zxc\foo.dll
已在进程中加载)。这在 Global Flags 的“Show loader snaps”复选框的帮助下得到了确认。
我该如何解决它?
bar.dll
是第三方,所以我无法在其中实现 DELAYLOAD 。
而且我无法阻止加载c:\abc\foo.dll
到进程中。
我正在考虑 hooking ntdll!LdrpFindOrMapDll
,但它似乎不可靠,我必须在所有受支持的 Windows 版本中对此进行彻底测试,所以我首先寻找一种更简单的解决方法。