Gate)) { fOk = FALSE; } if (!SpySegment (X86_SEGMENT_OTHER, pInterrupt->Gate.Selector, } pInterrupt->pOffset = SpyGateOffset ( } else { RtlZeroMemory (pInterrupt, SPY_IN。5 《Undocumented Windows 2000 Secrets》翻譯 --- 第四章( 二 )。" />

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

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

<< X86_SELECTOR_SHIFT,
&pInterrupt->Selector))
{
fOk = FALSE;
}
if (!SpyIdtGate (&pInterrupt->Selector,
&pInterrupt->Gate))
{
fOk = FALSE;
}
if (!SpySegment (X86_SEGMENT_OTHER,
pInterrupt->Gate.Selector,
&pInterrupt->Segment))
{
fOk = FALSE;
}
pInterrupt->pOffset = SpyGateOffset (&pInterrupt->Gate);
}
else
{
RtlZeroMemory (pInterrupt, SPY_INTERRUPT_);
}
pInterrupt->fOk = fOk;
}
return fOk;
}
// -----------------------------------------------------------------
PVOID SpyGateOffset (PX86_GATE pGate)
{
return (PVOID) (pGate->Offset1 | (pGate->Offset2 << 16));
}
列表 4-18. 查詢中斷屬性
表 4-3. 任務(wù)狀態(tài)段( TSS )中的 CPU 狀態(tài)域
偏移量
位數(shù)
ID
描 述
0x00
16
前一個(gè)任務(wù)的鏈接
0x04
32
ESP0
Ring0 級(jí)的堆棧指針寄存器
0x08
16
SS0
Ring0 級(jí)的堆棧段寄存器
0x0C
32
ESP1
Ring1 級(jí)的堆棧指針寄存器
0x10
16
SS1
Ring1 級(jí)的堆棧段寄存器
0x14
32
ESP2
Ring2 級(jí)的堆棧指針寄存器
0x18
16
SS2
Ring2 級(jí)的堆棧段寄存器
0x1C
32
CR3
頁目錄基址寄存器( PDBR )
0x20
32
EIP
指令指針寄存器
0x24
32
EFLAGS
處理器標(biāo)志寄存器
0x28
32
EAX
通用寄存器
0x2C
32
ECX
通用寄存器
0x30
32
EDX
通用寄存器
0x34
32
EBX
通用寄存器
0x38
32
ESP
堆棧指針寄存器
0x3C
32
EBP
基地址指針寄存器
0x40
32
ESI
源索引寄存器
0x44
32
EDI
目標(biāo)索引寄存器
0x48
16
ES
擴(kuò)展段寄存器
0x4C
16
CS
代碼段寄存器
0x50
16
SS
堆棧段寄存器
0x54
16
DS
數(shù)據(jù)段寄存器
0x58
16
FS
附加的數(shù)據(jù)段寄存器 #1
0x5C
16
GS
附加的數(shù)據(jù)段寄存器 #2
0x60
16
LDT
本地描述符標(biāo)的段選擇器
0x64
1
1
調(diào)試陷阱標(biāo)志
0x66
16
I/O Map 的基地址
0x68
-
CPU 狀態(tài)信息結(jié)束
SpyInterrupt() 調(diào)用的 SpySegment() 、 SpySelector() 函數(shù)已經(jīng)在 列表 4-5 和 列表 4-16 中給出 。SpyGateOffset() 位于 列表 4-18 的末尾,它的工作和 SpyDescriptorBase() 、 SpyDescriptorLimit() 類似,從 X86_GATE 結(jié)構(gòu)中取出 Offset1 和 Offset2 位域,并適當(dāng)?shù)慕M織它們以構(gòu)成一個(gè) 32 位地址 。SpyIdtGaet() 定義于 列表 4-19。它與 SpyDescriptor() 十分類似 。匯編指令 SIDT 存儲(chǔ)一個(gè) 48 位的值,該值就是 CPU 的 IDT 寄存器的內(nèi)容,它由一個(gè) 16 位的表大小限制值和 IDT 的 32 位線性基地址構(gòu)成 。列表 4-19 中的剩余代碼將選擇器的描述符索引和 IDT 的大小限制值進(jìn)行比較,如果 OK,則對(duì)應(yīng)的中斷描述符將被復(fù)制到調(diào)用者提供的 X86_GATE 結(jié)構(gòu)中 。否則,門結(jié)構(gòu)的所有成員都將被設(shè)置為 0。
BOOL SpyIdtGate (PX86_SELECTOR pSelector,
PX86_GATE pGate)
{
X86_TABLE idt;
PX86_GATE pGates = NULL;
BOOL fOk = FALSE;
if (pGate != NULL)
{
if (pSelector != NULL)
{
__asm
{
sidt idt.wLimit
}
if ((pSelector->wValue & X86_SELECTOR_INDEX)
<= idt.wLimit)
{
pGates = idt.pGates;
}
}
if (pGates != NULL)
{
RtlCopyMemory (pGate,
pGatespSelector->Index,
X86_GATE_);
fOk = TRUE;

推薦閱讀