Memory management DLL';只有部分装载
我的应用程序包含一些关于DLL的特定逻辑(这里解释起来有点太复杂)。 但在这种逻辑中,我注意到(在客户的Citrix终端服务器上): 在NTDLL.DLL上调用GetModuleInformation时,返回的MODULEINFO返回第一个地址(lpBaseOfDll)0x7D60000和大小0xf0000(因此其最后一个字节应为0x7D6EFFF) 但是,在一个崩溃转储文件中,我在WinDbg中看到了以下内容(使用!地址):Memory management DLL';只有部分装载,memory-management,dll,citrix,Memory Management,Dll,Citrix,我的应用程序包含一些关于DLL的特定逻辑(这里解释起来有点太复杂)。 但在这种逻辑中,我注意到(在客户的Citrix终端服务器上): 在NTDLL.DLL上调用GetModuleInformation时,返回的MODULEINFO返回第一个地址(lpBaseOfDll)0x7D60000和大小0xf0000(因此其最后一个字节应为0x7D6EFFF) 但是,在一个崩溃转储文件中,我在WinDbg中看到了以下内容(使用!地址): *7D600007D601000 1000图像“J:\WINDOWS
*7D600007D601000 1000图像“J:\WINDOWS\system32\ntdll.dll”
*7D61000 7d65f000 4f000
*7d65f000 7d660000 1000
*7D6600 7d699000 39000
*7d6a0000 7d6a6000 6000
*7d6b0000 7d6df000 2f000
*7d6e0000 7d6e4000 4000
*7d800000 7d801000 1000映像“J:\WINDOWS\SysWOW64\gdi32.dll”
*7d810000 7d855000 45000
*7d860000 7d861000 1000
*7d861000 7d862000 1000
*7d870000 7d871000 1000
*7d880000 7d882000 2000
因此,看起来NTDLL.DLL的大小只有0x1000,而不是0xf0000
这解释了为什么超过0x1000大小的VirtualLock调用失败(错误代码998:对内存位置的访问无效),并且访问内存会使应用程序崩溃
在哪里可以找到DLL仅部分加载的解释?Citrix是否用存根替换DLL,但没有通过GetModuleInformation正确报告此情况?还是发生了什么事
为什么NTDLL.DLL是从J:\WINDOWS\SYSTEM32加载的,而其他大多数DLL是从J:\WINDOWS\SYSWOW64加载的?(这可能表明确实使用了一些32/64存根)
这是我第一次遇到这个问题。Citrix没有删除DLL,但它确实对各种DLL进行了大量的挂接。这将是我对你看到的问题的最佳猜测。以下文章介绍挂钩以及如何禁用挂钩: 尝试禁用应用程序的挂钩,看看这些问题是否消失
* 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>