KTHREAD 结构体属性介绍
生活随笔
收集整理的這篇文章主要介紹了
KTHREAD 结构体属性介绍
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
typedef struct _KTHREAD {//// The dispatcher header and mutant listhead are fairly infrequently// referenced.//DISPATCHER_HEADER Header; // KTHREAD 是可等待對象,線程結束時有信號// 此鏈表存儲了屬于該線程的所有 mutant(對應3環的 mutex)// 一旦該線程獲得了 mutex ,則 mutex 掛入該鏈表LIST_ENTRY MutantListHead;//// The following fields are referenced during context switches and wait// operatings. They have been carefully laid out to get the best cache// hit ratios.// 下面的域布局精心設計以提高 cache 命中率PVOID InitialStack; // 原始棧底PVOID StackLimit; // 棧頂的最低地址(棧界限)PVOID KernelStack; // 內核棧頂esp,線程切換時保存esp到這里// 自旋鎖對象,用于保護線程數據成員KSPIN_LOCK ThreadLock;// KAPC_STATE 存儲了該線程的APC信息,包括用戶/內核APC鏈表,當前所屬進程(父進程或掛靠進程)// 是否正在執行內核APC,是否有要執行的用戶/內核APCunion {KAPC_STATE ApcState;struct {// 用來占用一個 KAPC_STATE 的大小UCHAR ApcStateFill[KAPC_STATE_ACTUAL_LENGTH];BOOLEAN ApcQueueable; // 是否可以插入APCvolatile UCHAR NextProcessor; // 處理器調度相關volatile UCHAR DeferredProcessor; // 處理器調度相關UCHAR AdjustReason; // 優先級調整的原因SCHAR AdjustIncrement; // 優先級調整量};};// 自旋鎖對象,用于保護APC隊列操作KSPIN_LOCK ApcQueueLock;#if !defined(_AMD64_)ULONG ContextSwitches; // 記錄線程切換次數volatile UCHAR State; // 9種線程狀態,見 _KTHREAD_STATE ,1就緒,2運行,5等待UCHAR NpxState; // 浮點寄存器狀態,本書不討論KIRQL WaitIrql; // 配合 WaitNext 使用,詳見 WaitNext 注釋KPROCESSOR_MODE WaitMode; // 線程等待時的處理器模式,0內核,1用戶#endifLONG_PTR WaitStatus; // 等待的結果狀態union {// 指向一個以 KWAIT_BLOCK 為元素的鏈表// KWAIT_BLOCK 對象指明了哪個線程在等待哪個分發器對象// 對于分發器對象,它又有另一個 KWAIT_BLOCK 鏈表指明哪些線程正在等待它// 細節要等到 5.4 節介紹線程同步機制時才能知道PKWAIT_BLOCK WaitBlockList;// 記錄了正在等待的門對象(也是一種分發器對象)PKGATE GateObject;// 等待門對象和等待其他分發器對象不會同時發生,所以放在一個共用體里了};BOOLEAN Alertable; // 線程等待時,是否可以被喚醒// WaitNext == TRUE 表示這個線程馬上要調用一個內核等待函數,所以不必解除線程調度器鎖// WaitNext == TRUE 時,WaitIrql 記錄了原先的 IRQL 值。BOOLEAN WaitNext;// 記錄線程等待的原因,見 KWAIT_REASON 枚舉類型,但不參與線程調度或決策UCHAR WaitReason;SCHAR Priority; // 動態優先級值UCHAR EnableStackSwap; // 本線程的內核棧是否允許被換出內存volatile UCHAR SwapBusy; // 本線程當前是否正在進行上下文切換BOOLEAN Alerted[MaximumMode]; // 長度為2的數組,指定該線程在內核/用戶模式是否可以被喚醒union {// 線程等待被執行時,通過此節點掛入 ThreadListEntry 鏈表(KPROCESS/EPROCESS成員)LIST_ENTRY WaitListEntry;// 當線程的內核棧需要被換入時,插入到全局鏈表 KiStackInSwapListHead 中// 當線程狀態為 DeferredReady 時,插入到某個CPU的 DeferredReadyListHead 鏈表中SINGLE_LIST_ENTRY SwapListEntry;};// 隊列分發器對象,如果不為NULL,說明當前線程正在處理此隊列對象中的項PRKQUEUE Queue;#if !defined(_AMD64_)// 記錄該線程進入等待時刻的時間點(時鐘滴答值的低32位),// 用于平衡集管理器根據線程等待時間的先后來做一些決策,詳見第4章ULONG WaitTime;union {struct {// 0表示不禁用APC,負數表示禁用APC// 線程執行過程中,有多種因素要禁止APC,這些因素以負值累加,// 當因素消除時,再減去相應的負值,只有當 KernelApcDisable / SpecialApcDisable// 等于0時,才允許插入或提交APC// 禁用普通內核APCSHORT KernelApcDisable;// 禁用特殊內核APCSHORT SpecialApcDisable;};ULONG CombinedApcDisable;};#endif// 指向進程地址空間中的一個TEB(線程環境塊)結構// TEB 包含了3環需要訪問的各種信息,如線程相關的GDI信息、系統支持的異常等// TEB 定義在 public\sdk\inc\pebteb.hPVOID Teb;union {// 線程定時器,用于實現可超時的等待,如 KeWaitForSingleObject 會用到此定時器對象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 1union {struct {LONG AutoAlignment : 1; // 繼承自 KPROCESSLONG DisableBoost : 1; // 繼承自 KPROCESSLONG ReservedFlags : 30;};LONG ThreadFlags;};};};union {// 包含4個KWAIT_BLOCK的數組,其中第4項專門用于可等待的定時器對象// KWAIT_BLOCK 結構代表一個線程正在等待一個分發器對象,或者說// 一個分發器對象正在被一個線程等待,他會被同時加入到兩個雙鏈表結構中。// 內核實現等待功能時,如果等待的對象數量少于4(3個分發器對象加上一個定時器對象),// 則無需額外分配 KWAIT_BLOCK 對象的內存,只需直接使用 WaitBlock 數組即可。// 如果等待的對象數量大于4,則內核必須分配額外的 KWAIT_BLOCK 對象內存。// 等待操作在內核中非常頻繁,所以利用靜態數組來滿足大多數情況下的內存需求,詳見5.4節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};// 記錄了線程在處理一個隊列項時掛入隊列對象的線程鏈表中的節點地址,詳見5.4.2節LIST_ENTRY QueueListEntry;//// The following fields are accessed during system service dispatch.//// 指向 KTRAP_FRAME 的指針,KTRAP_FRAME 存儲了 x86 所有常用寄存器// KTRAP_FRAME 用于線程切換時保存寄存器PKTRAP_FRAME TrapFrame;// 線程的回調棧地址,此棧在該線程從0環回3環時使用PVOID CallbackStack;// 指向該線程使用的系統服務表(全局變量 KeServiceDescriptorTable)// 如果這是一個GUI線程,那么此值指向影子系統服務表(KeServiceDescriptorTableShadow)PVOID ServiceTable;#if defined(_AMD64_)ULONG KernelLimit;#endif//// The following fields are referenced during ready thread and wait// completion.//// 當前APC狀態在 ApcStatePointer 數組中的索引// 標識當前線程處于什么狀態:0 正常狀態 1 掛靠狀態UCHAR ApcStateIndex;// 多處理器機器上該線程的理想處理器UCHAR IdealProcessor;// 是否被高優先級的線程搶占了,只有當一個線程正在運行或正在等待運行而被高優先級線程搶占,// 這個值才置1,其他時候總是0BOOLEAN Preempted;// 線程是否在所屬進程 KPROCESS 對象的 ReadyListHead 鏈表中BOOLEAN ProcessReadyQueue;#if defined(_AMD64_)PVOID Win32kTable;ULONG Win32kLimit;#endif// 內核棧是否駐留在內存中,內核棧換出內存時置0,換入內存時置1BOOLEAN KernelStackResident;// 靜態優先級值,繼承自 KPROCESS// 可通過KeSetBasePriorityThread 函數重新設定SCHAR BasePriority;// 優先級動態調整過程中的遞減值,參見 KiComputeNewPriority 函數// 優先級分為兩個區域,0-15是普通線程優先級;16-31是實時線程優先級,優先級調整不會跨區域。SCHAR PriorityDecrement;// Saturation 說明了線程基本優先級相對于進程基本優先級的調整量是否超過整個區間的一半// 取值范圍是 0, 1, -1CHAR Saturation;// 線程的用戶親和性,初始化時繼承自 KPROCESS,可通過 KeSetAffinityThread 函數修改KAFFINITY UserAffinity;// 指向線程的父進程對象,線程初始化時指定,見 KeInitThread 函數PKPROCESS Process;// 該線程的CPU親和性,線程初始化時繼承自 KPROCESS// 為線程指定的CPU集合必須是其進程的親和性CPU集合的子集// Affinity 的值可能有兩種設置:一是系統親和性,當該線程執行系統任務時通過// KeSetSystemAffinityThread 函數來設置;二是線程本身的親和性,稱為用戶// 親和性,通過 KeRevertToUserAffinityThread 函數來設置。KAFFINITY Affinity;//// The below fields are infrequently referenced.//// 配合 ApcStateIndex 使用,ApcStatePointer[ApcStateIndex] 總是指向所屬進程,// 正常情況下所屬進程是父進程,掛靠情況下所屬進程指的是掛靠進程。// 詳細信息請參考 5.2.6節關于APC機制的介紹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;#elseUCHAR OtherPlatformFill;#endif};};// 指向windows子系統管理的區域PVOID Win32Thread;// 當前棧底,線程初始化時,此值等于 InitialStackPVOID StackBase;union {// 初始化成一個專門的APC,當該APC被插入并交付時,調用 KiSuspendThread 函數,// 其執行結果是在線程的 SuspendSemaphore 信號量上等待,直到該信號量有信號,// 然后該線程被喚醒,繼續執行。線程的掛起操作正是通過這一機制實現的,詳見// KeSuspendThread 和 KeFreezeAllThreads 函數。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 {// 線程的恢復操作是通過控制 SuspendSemaphore 信號量的計數來實現的,// 詳見 KeResumeThread 等函數。KSEMAPHORE SuspendSemaphore;struct {UCHAR SuspendSemaphorefill[KSEMAPHORE_ACTUAL_LENGTH];// SListFaultCount 記錄了在 SListFaultAddress 地址上發生頁面錯誤的次數ULONG SListFaultCount;};};// 線程創建時,掛入到 KPROCESS 的 ThreadListHead 鏈表中LIST_ENTRY ThreadListEntry;// SListFaultAddress 記錄了上一次用戶模式互鎖單鏈表 POP 操作發生頁面錯誤的地址PVOID SListFaultAddress;#if defined(_WIN64)LONG64 ReadOperationCount;LONG64 WriteOperationCount;LONG64 OtherOperationCount;LONG64 ReadTransferCount;LONG64 WriteTransferCount;LONG64 OtherTransferCount;#endif} KTHREAD, *PKTHREAD, *PRKTHREAD;
總結
以上是生活随笔為你收集整理的KTHREAD 结构体属性介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ETHREAD 结构体属性介绍
- 下一篇: IDC dump 内存