KPCR:CPU控制区(Processor Control Region)
KPCR介绍
KPCR相当于一个副本,存储着线程相关的一些重要信息,这样CPU在处理时就不用查线程了。
1) 当线程进入0环时,FS:[0]指向KPCR(3环时FS:[0] -> TEB)
2) 每个CPU都有一个KPCR结构体(一个核一个)
3) KPCR中存储了CPU本身要用的一些重要数据:GDT、IDT以及线程相关的一些信息。
(在winbbg中查看KPCR结构体)
_NT_TIB主要成员介绍
1) +0x000 ExceptionList : Ptr32_EXCEPTION_REGISTRATION_RECORD
当前线程内核异常链表(SEH)
2) +0x004 StackBase : Ptr32 Void
+0x008 StackLimit : Ptr32 Void
当前线程内核栈的基址和大小
3) +0x018 Self : Ptr32 _NT_TIB
指向自己(也就是指向KPCR结构) 这样设计的目的是为了查找方便
KPCR的其他成员介绍
1) +0x01c SelfPcr : Ptr32 _KPCR
指向自己,方便寻址
2) +0x020 Prcb : Ptr32 _KPRCB
指向拓展结构体PRCB
3) +0x038 IDT : Ptr32 _KIDTENTRY
IDT表基址
4) +0x03c GDT : Ptr32 _KGDTENTRY
GDT表基址
5) +0x040 TSS : Ptr32 _KTSS
指针,指向TSS,每个CPU都有一个TSS.都是指向当前线程的
6) +0x051 Number : UChar
CPU编号:0 1 2 3 4 5。。。
7) +0x120 PrcbData : _KPRCB
拓展结构体
PRCB成员介绍
+0x004 CurrentThread : Ptr32 _KTHREAD
+0x008 NextThread : Ptr32 _KTHREAD
+0x00c IdleThread : Ptr32 _KTHREAD
当前线程
即将切换的下一个线程
空闲线程
kd> dt _KPCR
ntdll!_KPCR
+0x000 NtTib : _NT_TIB
+0x000 Used_ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 Used_StackBase : Ptr32 Void
+0x008 Spare2 : Ptr32 Void
+0x00c TssCopy : Ptr32 Void
+0x010 ContextSwitches : Uint4B
+0x014 SetMemberCopy : Uint4B
+0x018 Used_Self : Ptr32 Void
+0x01c SelfPcr : Ptr32 _KPCR
+0x020 Prcb : Ptr32 _KPRCB
+0x024 Irql : UChar
+0x028 IRR : Uint4B
+0x02c IrrActive : Uint4B
+0x030 IDR : Uint4B
+0x034 KdVersionBlock : Ptr32 Void
+0x038 IDT : Ptr32 _KIDTENTRY
+0x03c GDT : Ptr32 _KGDTENTRY
+0x040 TSS : Ptr32 _KTSS
+0x044 MajorVersion : Uint2B
+0x046 MinorVersion : Uint2B
+0x048 SetMember : Uint4B
+0x04c StallScaleFactor : Uint4B
+0x050 SpareUnused : UChar
+0x051 Number : UChar
+0x052 Spare0 : UChar
+0x053 SecondLevelCacheAssociativity : UChar
+0x054 VdmAlert : Uint4B
+0x058 KernelReserved : [14] Uint4B
+0x090 SecondLevelCacheSize : Uint4B
+0x094 HalReserved : [16] Uint4B
+0x0d4 InterruptMode : Uint4B
+0x0d8 Spare1 : UChar
+0x0dc KernelReserved2 : [17] Uint4B
+0x120 PrcbData : _KPRCB
kd> dt _NT_TIB//3环的TEB也有这个结构体,不过存的是3环的信息
ntdll!_NT_TIB
+0x000 ExceptionList : Ptr32 _EXCEPTION_REGISTRATION_RECORD
+0x004 StackBase : Ptr32 Void
+0x008 StackLimit : Ptr32 Void
+0x00c SubSystemTib : Ptr32 Void
+0x010 FiberData : Ptr32 Void
+0x010 Version : Uint4B
+0x014 ArbitraryUserPointer : Ptr32 Void
+0x018 Self : Ptr32 _NT_TIB
参考资料
[1] 滴水视频