内核线程结构--KTHREAD
来源:互联网 发布:通达信软件电脑版 编辑:程序博客网 时间:2024/05/01 07:09
WRK中KTHREADtypedef struct _KTHREAD { // // The dispatcher header and mutant listhead are fairly infrequently // referenced. // DISPATCHER_HEADER Header;//线程对象也是个分发器对象。 LIST_ENTRY MutantListHead;//指向一个链表头,该链表中包含了所有属于该线程的MUTEX对象 // // The following fields are referenced during context switches and wait // operatings. They have been carefully laid out to get the best cache // hit ratios. // PVOID InitialStack;//原始栈位置 PVOID StackLimit;//记录栈的低地址 PVOID KernelStack;//记录了真正内核调用栈的开始位置 KSPIN_LOCK ThreadLock;//自旋锁,用于保护线程数据成员。 union { KAPC_STATE ApcState;//指定了一个线程的APC信息。 struct { UCHAR ApcStateFill[KAPC_STATE_ACTUAL_LENGTH]; BOOLEAN ApcQueueable; volatile UCHAR NextProcessor; volatile UCHAR DeferredProcessor; UCHAR AdjustReason; SCHAR AdjustIncrement; }; }; KSPIN_LOCK ApcQueueLock;//自旋锁,用于保护APC队列的操作#if !defined(_AMD64_) ULONG ContextSwitches;//记录了该线程进行了多少次环境切换。 volatile UCHAR State;//该线程当前的状态。 UCHAR NpxState;//反应了浮点处处理器的状态 KIRQL WaitIrql;//和WaitNext一起使用,当WaitNext为True时,WaitIrql记录了原先的IRQL值 KPROCESSOR_MODE WaitMode;//记录了当线程等待时的处理器模式#endif LONG_PTR WaitStatus;//记录了等待的结果状态。 union { PKWAIT_BLOCK WaitBlockList;//指向一个以KWAIT_BLOCK为元素的链表,//其中的KAIT_BLOCK对象指明了哪个线程在等待哪个分发器对象。 PKGATE GateObject;//正在等待的门对象。等待门对象和等待其他分发器对象是不同时发生的。 }; BOOLEAN Alertable;//说明一个线程是否可以被唤醒 BOOLEAN WaitNext;//true表示这个线程马上要调用一个内核等待函数 UCHAR WaitReason;//记录了一个线程等待的理由。 SCHAR Priority;//包含了该线程的优先级值,这是指定它的动态优先级, UCHAR EnableStackSwap;//说明本线程栈是否允许被换出到外存中。 volatile UCHAR SwapBusy;//指定了本线程当前是否正在进行上下文环境切换 BOOLEAN Alerted[MaximumMode]; union { LIST_ENTRY WaitListEntry; SINGLE_LIST_ENTRY SwapListEntry; }; PRKQUEUE Queue;//队列分发器对象#if !defined(_AMD64_) ULONG WaitTime; union { struct { SHORT KernelApcDisable; SHORT SpecialApcDisable; }; ULONG CombinedApcDisable; };#endif PVOID Teb;//它指向进程地址空间中的一个TEB结构。 union { KTIMER Timer;//附在一个线程上的定时器,当一个线程在执行过程中需要定时时,比如实现可超时的等待函数 struct { UCHAR TimerFill[KTIMER_ACTUAL_LENGTH]; // // N.B. The following bit number definitions must match the // following bit field. // // N.B. These bits can only be written with interlocked // operations. // #define KTHREAD_AUTO_ALIGNMENT_BIT 0#define KTHREAD_DISABLE_BOOST_BIT 1 union { struct { LONG AutoAlignment : 1; LONG DisableBoost : 1; LONG ReservedFlags : 30; }; LONG ThreadFlags; }; }; }; union { KWAIT_BLOCK WaitBlock[THREAD_WAIT_OBJECTS + 1]; struct { UCHAR WaitBlockFill0[KWAIT_BLOCK_OFFSET_TO_BYTE0]; BOOLEAN SystemAffinityActive; }; struct { UCHAR WaitBlockFill1[KWAIT_BLOCK_OFFSET_TO_BYTE1]; CCHAR PreviousMode; }; struct { UCHAR WaitBlockFill2[KWAIT_BLOCK_OFFSET_TO_BYTE2]; UCHAR ResourceIndex; }; struct { UCHAR WaitBlockFill3[KWAIT_BLOCK_OFFSET_TO_BYTE3]; UCHAR LargeStack; };#if defined(_AMD64_) struct { UCHAR WaitBlockFill4[KWAIT_BLOCK_OFFSET_TO_LONG0]; ULONG ContextSwitches; }; struct { UCHAR WaitBlockFill5[KWAIT_BLOCK_OFFSET_TO_LONG1]; volatile UCHAR State; UCHAR NpxState; KIRQL WaitIrql; KPROCESSOR_MODE WaitMode; }; struct { UCHAR WaitBlockFill6[KWAIT_BLOCK_OFFSET_TO_LONG2]; ULONG WaitTime; }; struct { UCHAR WaitBlockFill7[KWAIT_BLOCK_OFFSET_TO_LONG3]; union { struct { SHORT KernelApcDisable; SHORT SpecialApcDisable; }; ULONG CombinedApcDisable; }; };#endif }; LIST_ENTRY QueueListEntry; // // The following fields are accessed during system service dispatch. // PKTRAP_FRAME TrapFrame;//记录控制流状态的数据结构。 PVOID CallbackStack; PVOID ServiceTable;//指向该线程使用的系统服务表#if defined(_AMD64_) ULONG KernelLimit;#endif // // The following fields are referenced during ready thread and wait // completion. // UCHAR ApcStateIndex; UCHAR IdealProcessor; BOOLEAN Preempted;//说明这个线程是否被高优先级的线程抢占 BOOLEAN ProcessReadyQueue;//说明一个线程是否在所属进程KPROCESS对象的ReadyListHead链表中#if defined(_AMD64_) PVOID Win32kTable; ULONG Win32kLimit;#endif BOOLEAN KernelStackResident; SCHAR BasePriority;//线程的静态优先级,其所属值是所属进程的BasePriority SCHAR PriorityDecrement;//一个线程在优先级动态调整过程中的递减值 CHAR Saturation;//说明线程的基本优先级相对于进程的基本优先级的调整量是否超过了整个区间的一半 KAFFINITY UserAffinity; PKPROCESS Process; KAFFINITY Affinity; // // The below fields are infrequently referenced. // PKAPC_STATE ApcStatePointer[2]; union { KAPC_STATE SavedApcState; struct { UCHAR SavedApcStateFill[KAPC_STATE_ACTUAL_LENGTH]; CCHAR FreezeCount; CCHAR SuspendCount; UCHAR UserIdealProcessor; UCHAR CalloutActive;#if defined(_AMD64_) BOOLEAN CodePatchInProgress;#elif defined(_X86_) UCHAR Iopl;#else UCHAR OtherPlatformFill;#endif }; }; PVOID Win32Thread; PVOID StackBase; union { KAPC SuspendApc; struct { UCHAR SuspendApcFill0[KAPC_OFFSET_TO_SPARE_BYTE0]; SCHAR Quantum; }; struct { UCHAR SuspendApcFill1[KAPC_OFFSET_TO_SPARE_BYTE1]; UCHAR QuantumReset; }; struct { UCHAR SuspendApcFill2[KAPC_OFFSET_TO_SPARE_LONG]; ULONG KernelTime; }; struct { UCHAR SuspendApcFill3[KAPC_OFFSET_TO_SYSTEMARGUMENT1]; PVOID TlsArray; }; struct { UCHAR SuspendApcFill4[KAPC_OFFSET_TO_SYSTEMARGUMENT2]; PVOID BBTData; }; struct { UCHAR SuspendApcFill5[KAPC_ACTUAL_LENGTH]; UCHAR PowerState; ULONG UserTime; }; }; union { KSEMAPHORE SuspendSemaphore; struct { UCHAR SuspendSemaphorefill[KSEMAPHORE_ACTUAL_LENGTH]; ULONG SListFaultCount; }; }; LIST_ENTRY ThreadListEntry;//当一个线程被创建时,它会被加入到进程对象的ThreadListhead链表中。 PVOID SListFaultAddress;#if defined(_WIN64) LONG64 ReadOperationCount; LONG64 WriteOperationCount; LONG64 OtherOperationCount; LONG64 ReadTransferCount; LONG64 WriteTransferCount; LONG64 OtherTransferCount;#endif} KTHREAD, *PKTHREAD, *PRKTHREAD;