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

5 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章

第四章 探索 Windows 2000 的內(nèi)存管理機(jī)制
翻譯: Kendiv( fcczj@263.net)
更新: Sunday, February 17, 2005
聲明:轉(zhuǎn)載請(qǐng)注明出處,并保證文章的完整性,本人保留譯文的所有權(quán)利 。
IOCTL 函數(shù) SPY_IO_INTERRUPT
SPY_IO_INTERRUP 類似于 SPY_IO_SEGEMT,不過該函數(shù)僅影響存儲(chǔ)在系統(tǒng)中斷描述符表( IDT )的中斷描述符,不會(huì)涉及 LDT 或 GDT 描述符 。IDT 最多可容納 256 個(gè)描述符,這些描述符可用來描述任務(wù)門、中斷門或陷阱門(參見 Intel 1999c, pp. 5-11ff ) 。順便說一下,中斷和陷阱在本質(zhì)上十分相似,二者只存在微小的差異:在進(jìn)入一個(gè)中斷處理例程后,總是會(huì)屏蔽其他中斷;而進(jìn)入陷阱處理例程卻不會(huì)修改中斷標(biāo)志 。SPY_IO_INTERRUPT 的調(diào)用者提供一個(gè) 0 到 255 之間的中斷號(hào),該中斷號(hào)將位于輸入緩沖區(qū)中,而一個(gè) SPY_INTERRUPT 結(jié)構(gòu)將作為輸出數(shù)據(jù)被存放到輸出緩沖區(qū)中,如果成功返回,該結(jié)構(gòu)中將包含對(duì)應(yīng)的中斷處理例程的屬性 。由 Dispatcher 調(diào)用的幫助函數(shù) SpyOutputInterrupt() 只是一個(gè)簡(jiǎn)單的外包函數(shù),它實(shí)際上調(diào)用 SpyInterrupt() 函數(shù)并且將需要返回的數(shù)據(jù)復(fù)制到輸出緩沖區(qū)中 。列表 4-18 給出了這兩個(gè)函數(shù),以及它們操作的 SPY_INTERRUPT 結(jié)構(gòu) 。稍后一些,SpyInterrupt() 函數(shù)將填充如下項(xiàng)目:
l Selector 用來指定一個(gè)任務(wù)狀態(tài)段( Task-State Segment, TSS )或代碼段( Code Segment )的選擇器 。代碼段選擇器用來確定中斷或陷阱處理例程所在的段 。
l Gate 用來表示一個(gè) 64 位的任務(wù)門、中斷門或陷阱門描述符,由 Selector 確定其地址 。
l Segment 包含段的屬性,該段的地址由前面的 Gate 給出 。
l pOffset 指定中斷或陷阱處理例程的入口地址相對(duì)基地址的偏移量 。這里的基地址是指中斷或陷阱處理例程所在代碼段的起始地址 。因?yàn)槿蝿?wù)門不包含偏移量,所以,如果輸入的選擇器指向一個(gè) TSS,則忽略該成員 。
l fOk 一個(gè)標(biāo)志變量,用來指示 SPY_INTERRUPT 結(jié)構(gòu)中的數(shù)據(jù)是否有效 。
通常情況下,TSS 被用來保證一個(gè)錯(cuò)誤情況可以被一個(gè)有效的任務(wù)處理 。這是一個(gè)特殊的系統(tǒng)段類型( system segment type ),它可以保存 104 個(gè)字節(jié)的進(jìn)程狀態(tài)信息,該信息在任務(wù)切換時(shí),用來進(jìn)行任務(wù)的恢復(fù),如 表 4-3 所示 。當(dāng)與任務(wù)相關(guān)的中斷發(fā)生時(shí),CPU 總是強(qiáng)制切換該任務(wù),并將所有的 CPU 寄存器保存到 TSS 中 。Windows 2000 在中斷位置 0x02 (非屏蔽中斷 [NMI],0x08[Double Fault] 和 0x12[ 堆棧段故障 ] )處保存任務(wù)門 。剩余的位置指向中斷處理例程 。不使用的中斷由一個(gè)啞元例程 ---KiUnexpectedInterruptNNN() 處理,這里的 NNN 為一個(gè)十進(jìn)制數(shù) 。這些啞元例程最后都匯集到內(nèi)部函數(shù) KIEndUnexpectedRange(),在這里,這些例程將依次進(jìn)入 KiUnexpectedInterruptTail()。
typedef struct _SPY_INTERRUPT
{
X86_SELECTOR Selector;
X86_GATE Gate;
SPY_SEGMENT Segment;
PVOID pOffset;
BOOL fOk;
}
SPY_INTERRUPT, *PSPY_INTERRUPT, **PPSPY_INTERRUPT;
#define SPY_INTERRUPT_ sizeof (SPY_INTERRUPT)
// -----------------------------------------------------------------
NTSTATUS SpyOutputInterrupt (DWord dInterrupt,
PVOID pOutput,
DWORD dOutput,
PDWORD pdInfo)
{
SPY_INTERRUPT si;
SpyInterrupt (dInterrupt, &si);
return SpyOutputBinary (&si, SPY_INTERRUPT_,
pOutput, dOutput, pdInfo);
}
// -----------------------------------------------------------------
BOOL SpyInterrupt (DWORD dInterrupt,
PSPY_INTERRUPT pInterrupt)
{
BOOL fOk = FALSE;
if (pInterrupt != NULL)
{
if (dInterrupt <= X86_SELECTOR_LIMIT)
{
fOk = TRUE;
if (!SpySelector (X86_SEGMENT_OTHER,
dInterrupt

推薦閱讀