2013-02-28 48 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的存根)。

這是我第一次遇到這樣的問題。

回答