2.线程结构体
kd> dt _ETHREAD
ntdll!_ETHREAD+0x000 Tcb : _KTHREAD//子結構(微內核)+0x1c0 CreateTime : _LARGE_INTEGER//線程的創建時間+0x1c0 NestedFaultCount : Pos 0, 2 Bits+0x1c0 ApcNeeded : Pos 2, 1 Bit+0x1c8 ExitTime : _LARGE_INTEGER//線程的退出時間+0x1c8 LpcReplyChain : _LIST_ENTRY//跨進程通信雙鏈表+0x1c8 KeyedWaitChain : _LIST_ENTRY//帶鍵值事件的等待雙鏈表+0x1d0 ExitStatus : Int4B//線程退出狀態+0x1d0 OfsChain : Ptr32 Void+0x1d4 PostBlockList : _LIST_ENTRY//雙鏈表頭節點 (用于向配置管理器登錄注冊表鍵值的變化通知)+0x1dc TerminationPort : Ptr32 _TERMINATION_PORT//鏈表頭(當一個線程退出時,系統會通知所有已經登記過,要接收其終止事件的那些端口)+0x1dc ReaperLink : Ptr32 _ETHREAD//單鏈表節點 (線程退出時會被掛上去)+0x1dc KeyedWaitValue : Ptr32 Void//帶鍵值事件的鍵值+0x1e0 ActiveTimerListLock : Uint4B//操作下面那個鏈表的自旋鎖+0x1e4 ActiveTimerListHead : _LIST_ENTRY//雙鏈表頭(當前線程的所有定時器)+0x1ec Cid : _CLIENT_ID//線程id,進程id都在里面+0x1f4 LpcReplySemaphore : _KSEMAPHORE//LPC應答通知+0x1f4 KeyedWaitSemaphore : _KSEMAPHORE//處理帶鍵值的事件+0x208 LpcReplyMessage : Ptr32 Void//LPC應答消息(其中包含了LPC應答通知)+0x208 LpcWaitingOnPort : Ptr32 Void//在那個端口對象上等待+0x20c ImpersonationInfo : Ptr32 _PS_IMPERSONATION_INFORMATION//線程的模仿信息+0x210 IrpList : _LIST_ENTRY//當前線程所有正在處理尚未完成的IO請求 (雙鏈表頭) +0x218 TopLevelIrp : Uint4B//指向線程的頂級的IRP+0x21c DeviceToVerify : Ptr32 _DEVICE_OBJECT//指向一個待校驗的設備對象+0x220 ThreadsProcess : Ptr32 _EPROCESS//自身進程結構體+0x224 StartAddress : Ptr32 Void//線程的啟動地址(系統DLL)+0x228 Win32StartAddress : Ptr32 Void//子系統接收到的線程啟動的地址(CreateThread接收到的線程函數)+0x228 LpcReceivedMessageId : Uint4B//LPC接收到的消息ID+0x22c ThreadListEntry : _LIST_ENTRY/*雙向鏈表一個進程所有的線程都掛在一個鏈表中掛的就是這個位置一共有兩個這樣的鏈表
*/+0x234 RundownProtect : _EX_RUNDOWN_REF//線程的停止保護鎖+0x238 ThreadLock : _EX_PUSH_LOCK//推鎖 (保護線程的數據屬性)+0x23c LpcReplyMessageId : Uint4B//指明當前線程正在等待的一個消息應答+0x240 ReadClusterSize : Uint4B//指明了在一次io操作中讀取了多少個頁面+0x244 GrantedAccess : Uint4B//線程的訪問權限+0x248 CrossThreadFlags : Uint4B//一些針對跨線程訪問的標志位+0x248 Terminated : Pos 0, 1 Bit//線程已經執行終止操作+0x248 DeadThread : Pos 1, 1 Bit//創建失敗+0x248 HideFromDebugger : Pos 2, 1 Bit//該線程對于調試器不可見+0x248 ActiveImpersonationInfo : Pos 3, 1 Bit//線程正在模仿+0x248 SystemThread : Pos 4, 1 Bit//是一個系統線程+0x248 HardErrorsAreDisabled : Pos 5, 1 Bit//對于該線程硬件錯誤無效+0x248 BreakOnTermination : Pos 6, 1 Bit//調試器在線程終止時停下該線程+0x248 SkipCreationMsg : Pos 7, 1 Bit//不向調試器發送創建消息+0x248 SkipTerminationMsg : Pos 8, 1 Bit//不向調試器發送終止消息+0x24c SameThreadPassiveFlags : Uint4B//只有在最底中斷級別才可訪問的標志位,并且只能被該線程自身訪問+0x24c ActiveExWorker : Pos 0, 1 Bit+0x24c ExWorkerCanWaitUser : Pos 1, 1 Bit+0x24c MemoryMaker : Pos 2, 1 Bit+0x250 SameThreadApcFlags : Uint4B//是一些在apc中斷級別上,被該線程自身訪問的標志位+0x250 LpcReceivedMsgIdValid : Pos 0, 1 Bit+0x250 LpcExitThreadCalled : Pos 1, 1 Bit+0x250 AddressSpaceOwner : Pos 2, 1 Bit+0x254 ForwardClusterOnly : UChar//是否僅僅前向聚集?+0x255 DisablePageFaultClustering : UChar//控制頁面交換的聚集與否
//_ETHREAD-> +0x000 Tcb : _KTHREAD
kd> dt _KTHREAD
ntdll!_KTHREAD+0x000 Header : _DISPATCHER_HEADER//可等待對象+0x010 MutantListHead : _LIST_ENTRY//突變體對象鏈表+0x018 InitialStack : Ptr32 Void//記錄原始棧的位置(高地址) (線程切換相關)+0x01c StackLimit : Ptr32 Void//記錄棧的低地址 (線程切換相關)+0x020 Teb : Ptr32 Void//線程環境塊,大小4KB,位于用戶地址空間。用戶層FS:[0]就是teb+0x024 TlsArray : Ptr32 Void//+0x028 KernelStack : Ptr32 Void/*內核調用棧的開始位置,由于頂部還記錄了陷阱幀,浮點寄存器,它比InitialStack要低(KTRAP_FRAME_LENGTH+sizeof(FX_SAVE_AREA)) (線程切換相關)*/+0x02c DebugActive : UChar//如果值為-1不能使用dr0~dr7+0x02d State : UChar//線程狀態:就緒、等待要是運行+0x02e Alerted : [2] UChar//數組 用戶/內核模式下是否可以被喚醒+0x030 Iopl : UChar+0x031 NpxState : UChar//浮點處理器狀態+0x032 Saturation : Char//線程基本優先級+0x033 Priority : Char//動態優先級+0x034 ApcState : _KAPC_STATE//APC相關信息結構+0x04c ContextSwitches : Uint4B//該線程進行了多少次切換+0x050 IdleSwapBlock : UChar+0x051 Spare0 : [3] UChar+0x054 WaitStatus : Int4B//線程等待的結果狀態+0x058 WaitIrql : UChar//WaitNext為TRUE,記錄原先IRQL+0x059 WaitMode : Char+0x05a WaitNext : UChar//TRUE:這個線程馬上要調用一個內核等待函數+0x05b WaitReason : UChar//線程的等待理由+0x05c WaitBlockList : Ptr32 _KWAIT_BLOCK//線程在等待那個等待對象+0x060 WaitListEntry : _LIST_ENTRY//等待鏈表(雙鏈表) dd KiWaitListHead+0x060 SwapListEntry : _SINGLE_LIST_ENTRY//調度鏈表(單鏈表) dd KiWaitListHead+0x068 WaitTime : Uint4B+0x06c BasePriority : Char/*靜態優先級,可以通過KeSetBasePriorityThread()函數重新設定*/+0x06d DecrementCount : UChar+0x06e PriorityDecrement : Char//記錄線程動態調整優先級的遞減值+0x06f Quantum : Char//當線程的時間片限制+0x070 WaitBlock : [4] _KWAIT_BLOCK//等待哪個對象(WaitForSingleObject)+0x0d0 LegoData : Ptr32 Void+0x0d4 KernelApcDisable : Uint4B+0x0d8 UserAffinity : Uint4B//線程的用戶親和性+0x0dc SystemAffinityActive : UChar+0x0dd PowerState : UChar+0x0de NpxIrql : UChar+0x0df InitialNode : UChar+0x0e0 ServiceTable : Ptr32 Void//該線程使用的系統服務表的基址(參考消息機制章節)+0x0e4 Queue : Ptr32 _KQUEUE//隊列分發器對象+0x0e8 ApcQueueLock : Uint4B//APC隊列自旋鎖+0x0f0 Timer : _KTIMER//附在線程的定時器+0x118 QueueListEntry : _LIST_ENTRY//加入到隊列對象的線程鏈表中節點的地址+0x120 SoftAffinity : Uint4B+0x124 Affinity : Uint4B//線程的處理器的親和性+0x128 Preempted : UChar//TRUE:被優先級高的線程搶占了+0x129 ProcessReadyQueue : UChar//TRUE:線程在KPROCESS->ReadyListHead鏈表中+0x12a KernelStackResident : UChar//線程的內核棧是否在內存中 FALSE:被換出內存了 -282頁+0x12b NextProcessor : UChar//處理器調度選擇+0x12c CallbackStack : Ptr32 Void+0x130 Win32Thread : Ptr32 Void//指向Windows子系統的管理區域+0x134 TrapFrame : Ptr32 _KTRAP_FRAME//進0環時保存環境(寄存器)+0x138 ApcStatePointer : [2] Ptr32 _KAPC_STATE//APC相關+0x140 PreviousMode : Char//(先前模式)某些內核函數會判斷程序是0環調用還是3環調用的+0x141 EnableStackSwap : UChar//本線程內核棧是否允許被換出到外儲存 -282頁+0x142 LargeStack : UChar+0x143 ResourceIndex : UChar+0x144 KernelTime : Uint4B+0x148 UserTime : Uint4B+0x14c SavedApcState : _KAPC_STATE//APC相關+0x164 Alertable : UChar//線程是否可以被喚醒?+0x165 ApcStateIndex : UChar//當前APC狀態的索引ApcStatePointer+0x166 ApcQueueable : UChar//是否可以插入APC+0x167 AutoAlignment : UChar//+0x168 StackBase : Ptr32 Void//當前棧的基址(高地址)(線程切換相關)+0x16c SuspendApc : _KAPC//掛起APC (163)+0x19c SuspendSemaphore : _KSEMAPHORE//信號量狀態+0x1b0 ThreadListEntry : _LIST_ENTRY/*雙向鏈表,一個進程所有的線程都掛在一個鏈表中,一共有兩個這樣的鏈表,*/+0x1b8 FreezeCount : Char+0x1b9 SuspendCount : Char//當調試器調試目標進程,被中斷時,由于目標進程線程的SuspendCount不為零,所以目標進程的線程就無法被暫停。+0x1ba IdealProcessor : UChar+0x1bb DisableBoost : UChar//
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結