KPCR结构体

mac2026-02-21  9

@0环的ETHREAD结构体是记录线程的相关信息,EPROCESS结构体是记录进程相关的信息,同样我们每个CPU也有一个结构体来记录每个CPU的状态这个结构体就是KPCR结构体KPCR结构体如下下面该结构体中几个主要的成员, kd> dt _KPCR nt!_KPCR   +0x000 NtTib            : _NT_TIB   +0x01c SelfPcr          : Ptr32_KPCR   +0x020 Prcb             : Ptr32_KPRCB   +0x024 Irql             : UChar   +0x028 IRR              : Uint4B   +0x02c IrrActive        : Uint4B   +0x030 IDR              : Uint4B   +0x034 KdVersionBlock   : Ptr32Void   +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 DebugActive      : 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 @当代码进入0环时FS:0指向的就是KPCR结构体,在3环时指向的是TEB结构体 @KPCR结构体中存储了GDT,IDT等重要的信息@ +0x000 NtTib            : _NT_TIB 该成员是一个结构体,结构体如下:kd>DT _NT_TIBnt!_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@+0x000ExceptionList    : Ptr32_EXCEPTION_REGISTRATION_RECORD该链表存储了0环的异常处理程序。3环也是通过FS:0找到TEB在找到3环的异常处理程序。@+0x004StackBase        : Ptr32 Void   +0x008 StackLimit       : Ptr32 Void这两个成员存储的是当前线程的栈顶和栈底,线程在执行的时候就没有必要每次都要找到ETHREAD结构体再找到栈,而是直接从KPCR中找。@+0x018Self             : Ptr32 _NT_TIB该指针成员指向 _NT_TIB本身,这样方便查找 @KPCR结构体中的      +0x038 IDT              : Ptr32 _KIDTENTRY +0x03c GDT              : Ptr32 _KGDTENTRY 这两个成员分别存储了GDT表和IDT表的基址,还要注意GDT表和IDT表不是公用的,每个CPU都有自己的一套GDT表和IDT表。@  +0x040 TSS              : Ptr32 _KTSS 该成员存储的是0环的栈信息当从3环进入0环时从TSS中切换栈。                                                                                                                       @+0x01c SelfPcr          :Ptr32 _KPCR    +0x020 Prcb             : Ptr32 _KPRCB 这两个都是指针成员,分别指向KPCR结构体本省和偏移120处的KPRCB结构体,这样做的目的都是方便查找。 @+0x051 Number           :UChar 该成员记录的是当前CPU的编号@  +0x120 PrcbData         : _KPRCB该子结构体中也有几个重要的信息,结构体如下kd> DT _KPRCBnt!_KPRCB   +0x000 MinorVersion     : Uint2B   +0x002 MajorVersion     : Uint2B   +0x004 CurrentThread    : Ptr32 _KTHREAD   +0x008 NextThread       : Ptr32 _KTHREAD   +0x00c IdleThread       : Ptr32 _KTHREAD   +0x010 Number           : Char   +0x011 Reserved         : Char   +0x012 BuildType        : Uint2B   +0x014 SetMember        : Uint4B   +0x018 CpuType          : Char   +0x019 CpuID            : Char   +0x01a CpuStep          : Uint2B   +0x01c ProcessorState   : _KPROCESSOR_STATE   +0x33c KernelReserved   : [16] Uint4B   +0x37c HalReserved      : [16] Uint4B   +0x3bc PrcbPad0         : [92] UChar   +0x418 LockQueue        : [16] _KSPIN_LOCK_QUEUE   +0x498 PrcbPad1         : [8] UChar   +0x4a0 NpxThread        : Ptr32 _KTHREAD   +0x4a4 InterruptCount   : Uint4B   +0x4a8 KernelTime       : Uint4B   +0x4ac UserTime         : Uint4B   +0x4b0 DpcTime          : Uint4B   +0x4b4 DebugDpcTime     : Uint4B   +0x4b8 InterruptTime    : Uint4B   +0x4bc AdjustDpcThreshold : Uint4B   +0x4c0 PageColor        : Uint4B   +0x4c4 SkipTick         : Uint4B   +0x4c8 MultiThreadSetBusy : UChar   +0x4c9 Spare2           : [3] UChar   +0x4cc ParentNode       : Ptr32 _KNODE   +0x4d0 MultiThreadProcessorSet : Uint4B   +0x4d4 MultiThreadSetMaster : Ptr32 _KPRCB   +0x4d8 ThreadStartCount : [2] Uint4B   +0x4e0 CcFastReadNoWait : Uint4B   +0x4e4 CcFastReadWait   : Uint4B   +0x4e8 CcFastReadNotPossible : Uint4B   +0x4ec CcCopyReadNoWait : Uint4B   +0x4f0CcCopyReadWait   : Uint4B   +0x4f4 CcCopyReadNoWaitMiss : Uint4B   +0x4f8 KeAlignmentFixupCount : Uint4B   +0x4fc KeContextSwitches : Uint4B   +0x500 KeDcacheFlushCount : Uint4B   +0x504 KeExceptionDispatchCount : Uint4B   +0x508 KeFirstLevelTbFills : Uint4B   +0x50c KeFloatingEmulationCount : Uint4B   +0x510 KeIcacheFlushCount : Uint4B   +0x514 KeSecondLevelTbFills : Uint4B   +0x518 KeSystemCalls    : Uint4B   +0x51c SpareCounter0    : [1] Uint4B   +0x520 PPLookasideList  : [16] _PP_LOOKASIDE_LIST   +0x5a0 PPNPagedLookasideList : [32]_PP_LOOKASIDE_LIST   +0x6a0 PPPagedLookasideList : [32]_PP_LOOKASIDE_LIST   +0x7a0 PacketBarrier    : Uint4B   +0x7a4 ReverseStall     : Uint4B   +0x7a8 IpiFrame         : Ptr32 Void   +0x7ac PrcbPad2         : [52] UChar   +0x7e0 CurrentPacket    : [3] Ptr32 Void   +0x7ec TargetSet        : Uint4B   +0x7f0 WorkerRoutine    : Ptr32    void    +0x7f4 IpiFrozen        : Uint4B   +0x7f8 PrcbPad3         : [40] UChar   +0x820 RequestSummary   : Uint4B   +0x824 SignalDone       : Ptr32 _KPRCB   +0x828 PrcbPad4         : [56] UChar   +0x860 DpcListHead      : _LIST_ENTRY   +0x868 DpcStack         : Ptr32 Void   +0x86c DpcCount         : Uint4B   +0x870 DpcQueueDepth    : Uint4B   +0x874 DpcRoutineActive : Uint4B   +0x878 DpcInterruptRequested : Uint4B   +0x87c DpcLastCount     : Uint4B   +0x880 DpcRequestRate   : Uint4B   +0x884 MaximumDpcQueueDepth : Uint4B   +0x888 MinimumDpcRate   : Uint4B   +0x88c QuantumEnd       : Uint4B   +0x890 PrcbPad5         : [16] UChar   +0x8a0 DpcLock          : Uint4B   +0x8a4 PrcbPad6         : [28] UChar   +0x8c0 CallDpc          : _KDPC   +0x8e0 ChainedInterruptList : Ptr32 Void   +0x8e4 LookasideIrpFloat : Int4B   +0x8e8 SpareFields0     : [6] Uint4B   +0x900 VendorString     : [13] UChar   +0x90d InitialApicId    : UChar   +0x90e LogicalProcessorsPerPhysicalProcessor: UChar   +0x910 MHz              : Uint4B   +0x914 FeatureBits      : Uint4B   +0x918UpdateSignature  : _LARGE_INTEGER   +0x920 NpxSaveArea      : _FX_SAVE_AREA   +0xb30 PowerState       : _PROCESSOR_POWER_STATE @ +0x004 CurrentThread    : Ptr32 _KTHREAD   //当前线程结构体指针   +0x008 NextThread       : Ptr32 _KTHREAD  //下一个切换的线程结构体指针   +0x00c IdleThread       : Ptr32 _KTHREAD   //当没有线程切换时要执行的线程也就是空闲线程结构体的指针。

最新回复(0)