0

情况如下。这些 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 版本中对此进行彻底测试,所以我首先寻找一种更简单的解决方法。

4

1 回答 1

2

我认为您可以尝试使您的 foo.dll 成为并行程序集,并在您的 dll 清单中引用它。例如,5 和 6 版本的 Common Controls 和 Visual Studio 不同的 C 运行时版本应该如何在同一进程中共存。

如果这可行,不一定需要将您的 foo.dll 安装到 WinSxS 文件夹,也许您可​​以使用私有程序集。

如果并排组件对您不起作用,那么任何挂钩解决方案都是复杂且有风险的。想一想:像 GetModuleHandleW(L"foo.dll") 这样的调用数量应该在每个上下文中返回正确的一个 DLL 句柄!(如果 bar.dll 代码是在定义了 ISOLATION_AWARE_ENABLED 的情况下编译的,则并行程序集会执行此操作)

于 2017-02-05T12:33:31.853 回答