日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

9 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 三 )


0x2C
用戶自定義
ntoskrnl.exe
KiSetLowWaitHighThread
0x2D
用戶自定義
ntoskrnl.exe
KiDebugSerice
0x2E
用戶自定義
ntoskrnl.exe
KiSystemService
0x2F
用戶自定義
ntoskrnl.exe
KiTrap0F
0x30
用戶自定義
hal.dll
HalpClockInterrupt
0x38
用戶自定義
hal.dll
HalpProfileInterrupt
Windows 2000 的內存區(qū)域
W2k_mem.exe 的最后一個還未討論的選項是:b 選項 。該選項會產生 4GB 地址空間中相鄰內存區(qū)域的列表,這個列表非常大 。W2k_mem.exe 使用 Spy 設備的 IOCTL 函數(shù) SPY_IO_PAGE_ENTRY 遍歷整個 PTE 數(shù)組(位于地址 0xC0000000 )來生成這個列表 。在作為結果的每個 SPY_PAGE_ENTRY 結構中,通過將它們的 dSize 成員與其對應的 PTE 線性地址相加即可得到下一個 PTE 的地址 。列表 4-30 給出了該選項的實現(xiàn)方式 。
DWord WINAPI DisplayMemoryBlocks (HANDLE hDevice)
{
SPY_PAGE_ENTRY spe;
PBYTE pbPage, pbBase;
DWORD dBlock, dPresent, dTotal;
DWORD n = 0;
pbPage = 0;
pbBase = INVALID_ADDRESS;
dBlock = 0;
dPresent = 0;
dTotal = 0;
n= _printf (L"rnContiguous memory blocks:"
L"rn-------------------------rnrn");
do {
if (!IoControl (hDevice, SPY_IO_PAGE_ENTRY,
&pbPage, PVOID_,
&spe, SPY_PAGE_ENTRY_))
{
n= _printf (L" !!! Device I/O error !!!rn");
break;
}
if (spe.fPresent)
{
dPresent= spe.dSize;
}
if (spe.pe.dValue)
{
dTotal= spe.dSize;
if (pbBase == INVALID_ADDRESS)
{
n= _printf (L"%5lu : 0xlX ->",
dBlock, pbPage);
pbBase = pbPage;
}
}
else
{
if (pbBase != INVALID_ADDRESS)
{
n= _printf (L" 0xlX (0xlX bytes)rn",
pbPage-1, pbPage-pbBase);
pbBase = INVALID_ADDRESS;
}
}
}
while (pbPage= spe.dSize);
if (pbBase != INVALID_ADDRESS)
{
n= _printf (L"0xlXrn", pbPage-1);
}
n= _printf (L"rn"
L" Present bytes: 0xlXrn"
L" Total bytes: 0xlXrn",
dPresent, dTotal);
return n;
}
列表 4-30. 查找相鄰的線性內存塊
示列 4-16 摘錄了在我的機器上使用b 選項的輸出列表,可以看出其中的幾個區(qū)域非常有趣 。一些非常明顯的地址是: 0x00400000 ,這是 w2k_mem.exe 內存映像的起始地址(第 13 號塊),還有一個是 0x10000000 ,此處是 w2k_lib.dll 的基地址(第 23 號塊) 。TEB 和 PEB 頁也很容易認出(第 104 號塊), hal.dll (第 105 號塊), ntoskrnl.exe (第 105 號塊), win32k.sys (第 106 號塊) 。第 340---350 號塊是系統(tǒng) PTE 數(shù)組的一小段,第 347 號塊是頁目錄的一部分 。第 2122 號塊包含 SharedUserData 區(qū)域,第 2123 號塊由 KPCR 、 KPRCB 和包含線程和進程狀態(tài)信息的 CONTEXT 結構組成 。
示列 4-16. 相鄰內存塊列表示列
還需要補充一下, W2k_mem.exe 的b 選項會報告有大量的內存被使用,這可能超出了一個合理的值(比如,你機器上的物理內存數(shù)) 。請注意 示列 4-16 底部給出的匯總信息 。我現(xiàn)在真的使用了 700MB 的內存嗎? Windows 2000 的任務管理器顯示是 150MB ,那么這兒的又是什么呢?這種奇特的效果都是由第 105 號內存塊產生的,該內存塊表示的范圍: 0x80000000----0xA01A5FFF 占用了 0x201A6000 字節(jié),也就是說占用了 538,599,424 字節(jié) 。這顯然是不可能的 。問題是整個線性地址空間: 0x80000000 ---- 0x9FFFFFFF 都被映射到了物理內存: 0x00000000 ---- 0x1FFFFFFF ,在前面我已經提及過這一點 。該區(qū)域中的所有 4MB 頁都對應地址 0xC0300000 處的頁目錄中的一個有效的 PDE ,我們可以使用 w2k_memd #0x200 0xC0300800 命令來證明這一點( 示列 4-17 ) 。因為結果列表中的所有 PDE 都是奇數(shù)( 譯注:如果 PDE 為奇數(shù),證明其 P 位肯定為 1 ),所以它們對應的頁都必須存在;不過,它們并不需真正占用物理內存 。事實上,這一內存區(qū)域的大部分都是“空洞( hole )”,如果將其復制到緩沖區(qū)中,可發(fā)現(xiàn)它們都被 0xFF 填充 。因此,對于 w2k_mem.exe 輸出的內存使用情況,你不需要過于認真 。

推薦閱讀