2013-02-28 45 views
0

我的应用程序包含一些关于DLL的特定逻辑(这里有点太复杂了)。 但在这种逻辑,我注意到以下(客户的Citrix终端服务器上):DLL的部分加载

当在NTDLL.DLL调用GetModuleInformation,返回MODULEINFO返回0x7d600000第一地址(lpBaseOfDll)和大小的0xf0000(所以它的最后一个字节应该是0x7d6effff)。

然而,在一个崩溃转储文件我看到的WinDbg以下(使用地址!):

* 7d600000 7d601000  1000 Image "J:\WINDOWS\system32\ntdll.dll" 
* 7d610000 7d65f000 4f000 <unclassified> 
* 7d65f000 7d660000  1000 <unclassified> 
* 7d660000 7d699000 39000 <unclassified> 
* 7d6a0000 7d6a6000  6000 <unclassified> 
* 7d6b0000 7d6df000 2f000 <unclassified> 
* 7d6e0000 7d6e4000  4000 <unclassified> 
* 7d800000 7d801000  1000 Image "J:\WINDOWS\SysWOW64\gdi32.dll" 
* 7d810000 7d855000 45000 <unclassified> 
* 7d860000 7d861000  1000 <unclassified> 
* 7d861000 7d862000  1000 <unclassified> 
* 7d870000 7d871000  1000 <unclassified> 
* 7d880000 7d882000  2000 <unclassified> 

所以它看起来像只NTDLL.DLL的大小为0×1000,而不是0xf0000。

这就解释了为什么调用VirtualLock超越×1000尺寸失败(错误代码998:无效访问内存位置),并访问存储的应用程序崩溃。

我在哪里可以找到解释为什么DLL只是部分加载? Citrix是否通过存根代替DLL,但没有通过GetModuleInformation正确报告这个问题?或者还在发生其他事情?

为什么从J:\ WINDOWS \ SYSTEM32加载NTDLL.DLL,而大多数其他DLL的加载从J:\ WINDOWS \ SYSWOW64? (这可能表明确实使用了一些32/64的存根)。

这是我第一次遇到这样的问题。

回答