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