6

通过 LoadLibrary 加载外部 DLL(不受我们控制)时,我们遇到了一个问题,即这些 DLL 中的静态链接 CRT 无法分配光纤本地存储。这类似于mskb 193462,除了这是 FLS 并且只有 128 个。

有什么有用的方法可以解决这个问题吗?CRT 无论如何都使用 GetProcAddress 来查找 FlsAlloc(因为它显然在 XP 中从未存在过),所以它真的需要它吗?

(这是在 Vista 上,其中 FlsAlloc 实际存在;DLL 似乎正在使用 MSVC8)

4

1 回答 1

3

坦率地说,这里没有解决方案,除了加载更少的 dll。

您可以挂钩 dll 的导入地址表 - 但这会发生得太晚,因为您只能在 LoadLibrary 返回时安装 IAT 挂钩,并且 CRT 初始化代码可能会执行以响应已经处理的 DllProcessAttach。

我猜你可以在内存中找到 kernel32.dll 模块,然后修补 GetProcAddress 或 FlsAlloc 的导出地址以指向你的实现。但这种方法正在变得严重骇人听闻。

于 2009-09-17T15:21:28.040 回答