2009-09-17 60 views
5

当通过LoadLibrary加载外部DLL(不在我们的控制下)时,我们遇到了一个问题,那些DLL中的静态链接CRT未能分配光纤本地存储。这与mskb 193462类似,只是这是FLS,只有128个。解决太多静态链接CRT的fls限制?

是否有任何有效的方法来解决这个问题? CRT正在使用GetProcAddress来查找FlsAlloc(因为它显然从未在XP中存在过),所以它甚至真的需要它?

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

回答

2

有坦然无解这里,短加载的DLL少的。

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

我猜你可以在内存中找到kernel32.dll模块,并为GetProcAddress或可能的FlsAlloc修补输出地址以指向你的实现。但是这种方法变得严重ha。。

+0

与临时解决办法切割东西,希望我们不会需要太多:(试图补丁FlsAlloc是太可怕了,但因为大多数这些DLL在运行时加载(通过LoadLibrary)它可能在技术上可能。 – Mook 2009-09-26 08:19:19