typedef struct _KTHREAD
{
DISPATCHER_HEADER Header;
UINT64 CycleTime;
ULONG HighCycleTime;
UINT64 QuantumTarget;
PVOID InitialStack;
PVOID StackLimit;
PVOID KernelStack;
ULONG ThreadLock;
union
{
KAPC_STATE ApcState;
UCHAR ApcStateFill[23];
};
CHAR Priority;
WORD NextProcessor;
WORD DeferredProcessor;
ULONG ApcQueueLock;
ULONG ContextSwitches;
UCHAR State;
UCHAR NpxState;
UCHAR WaitIrql;
CHAR WaitMode;
LONG WaitStatus;
union
{
PKWAIT_BLOCK WaitBlockList;
PKGATE GateObject;
};
union
{
ULONG KernelStackResident: 1;
ULONG ReadyTransition: 1;
ULONG ProcessReadyQueue: 1;
ULONG WaitNext: 1;
ULONG SystemAffinityActive: 1;
ULONG Alertable: 1;
ULONG GdiFlushActive: 1;
ULONG Reserved: 25;
LONG MiscFlags;
};
UCHAR WaitReason;
UCHAR SwapBusy;
UCHAR Alerted[2];
union
{
LIST_ENTRY WaitListEntry;
SINGLE_LIST_ENTRY SwapListEntry;
};
PKQUEUE Queue;
ULONG WaitTime;
union
{
struct
{
SHORT KernelApcDisable;
SHORT SpecialApcDisable;
};
ULONG CombinedApcDisable;
};
PVOID Teb;
union
{
KTIMER Timer;
UCHAR TimerFill[40];
};
union
{
ULONG AutoAlignment: 1;
ULONG DisableBoost: 1;
ULONG EtwStackTraceApc1Inserted: 1;
ULONG EtwStackTraceApc2Inserted: 1;
ULONG CycleChargePending: 1;
ULONG CalloutActive: 1;
ULONG ApcQueueable: 1;
ULONG EnableStackSwap: 1;
ULONG GuiThread: 1;
ULONG ReservedFlags: 23;
LONG ThreadFlags;
};
union
{
KWAIT_BLOCK WaitBlock[4];
struct
{
UCHAR WaitBlockFill0[23];
UCHAR IdealProcessor;
};
struct
{
UCHAR WaitBlockFill1[47];
CHAR PreviousMode;
};
struct
{
UCHAR WaitBlockFill2[71];
UCHAR ResourceIndex;
};
UCHAR WaitBlockFill3[95];
};
UCHAR LargeStack;
LIST_ENTRY QueueListEntry;
PKTRAP_FRAME TrapFrame;
PVOID FirstArgument;
union
{
PVOID CallbackStack;
ULONG CallbackDepth;
};
PVOID ServiceTable;
UCHAR ApcStateIndex;
CHAR BasePriority;
CHAR PriorityDecrement;
UCHAR Preempted;
UCHAR AdjustReason;
CHAR AdjustIncrement;
UCHAR Spare01;
CHAR Saturation;
ULONG SystemCallNumber;
ULONG Spare02;
ULONG UserAffinity;
PKPROCESS Process;
ULONG Affinity;
PKAPC_STATE ApcStatePointer[2];
union
{
KAPC_STATE SavedApcState;
UCHAR SavedApcStateFill[23];
};
CHAR FreezeCount;
CHAR SuspendCount;
UCHAR UserIdealProcessor;
UCHAR Spare03;
UCHAR Iopl;
PVOID Win32Thread;
PVOID StackBase;
union
{
KAPC SuspendApc;
struct
{
UCHAR SuspendApcFill0[1];
CHAR Spare04;
};
struct
{
UCHAR SuspendApcFill1[3];
UCHAR QuantumReset;
};
struct
{
UCHAR SuspendApcFill2[4];
ULONG KernelTime;
};
struct
{
UCHAR SuspendApcFill3[36];
PKPRCB WaitPrcb;
};
struct
{
UCHAR SuspendApcFill4[40];
PVOID LegoData;
};
UCHAR SuspendApcFill5[47];
};
UCHAR PowerState;
ULONG UserTime;
union
{
KSEMAPHORE SuspendSemaphore;
UCHAR SuspendSemaphorefill[20];
};
ULONG SListFaultCount;
LIST_ENTRY ThreadListEntry;
LIST_ENTRY MutantListHead;
PVOID SListFaultAddress;
PVOID MdlForLockedTeb;
} KTHREAD, *PKTHREAD;
Header:说明该对象是一个分发器对象,可以被等待。线程结束时,等待被满足。
MutantListHead:指向一个链表头。链表中包含所有属于该线程的突变体对象(mutant,对应互斥体对象)。
InitialStack:原始栈位置(高地址)
StackLimit:栈低地址
KernelStack:内核调用栈开始位置
StackBase:当前栈的基地址。
ThreadLock:自旋锁,用于保护线程数据成员。
ApcState:KAPC_STATE结构,指定线程的APC信息,包括APC链表,是否有APC正在等待,是否正在处理APC。
ApcQueueable:是否可插入APC
NextProcessor:关于处理器调度的选择。
DeferredProcessor:关于处理器调度的选择。
AdjustReason:优先级调整原因
AdjustIncrement:优先级调整调整量
ApcQueueLock:保护APC队列的自旋锁。
ContextSwitches:记录线程进行了多少次切换。
State:线程当前状态。
NpxState:浮点处理器状态。
Alertable:线程是否可以被唤醒。
WaitNext:
WaitIrql:原先的IRQL。
WaitReason:等待原因
WaitMode:线程等待时的处理器模式,内核or用户
WaitStatus:等待的结果状态。
WaitBlockList:KWAIT_BLOCK为元素的链表,记录线程所有等待的分发器对象。每个分发器对象也有一个KWAIT_BLOCK组成的链表,记录所有等待在该对象的线程。
GateObject:等待的门对象,等待门对象和等待分发器对象不会同时发生。
Priority:动态优先级。
BasePriority:基本优先级。
PriorityDecrement:优先级动态调整过程中的递减值。
Saturation:线程基本优先级调整相对于进程基本优先级是否超过了区间的一半。
EnableStackSwap:内核栈是否准许被换出。
SwapBusy:当前是否正在进程上下文切换。
Alerted:线程在警告模式下是否可以被唤醒。
WaitListEntry:双向链表节点,等待被执行时,作为节点加入某链表
SwapListEntry:单链表节点,内核栈需要被换出时,加入KiStackInSwapListHead为头的链表。另外,线程处于DeferredReady状态时加入DeferredReadyListHead为头的链表。
Queue:队列分发器对象,线程正在处理此队列中的项。
WaitTime:线程进入等待时刻的时间点。
KernelApcDisable/SpecialApcDisable:内核APC和特殊内核APC是否被禁止。
TEB:进程地址空间的一个TEB域
Timer:定时器。
AutoAlignment:与KPROCESS相同
DisableBoost:与KPROCESS相同
WaitBlock:4个KWAIT_BLOCK成员的数组,线程等待的分发器少于4个时,使用这里的空间,不分配新空间。
QueueListEntry:线程处理一个队列项时,加入到队列对象的线程链表中的地址。
TrapFrame:指向KTRAP_FRAME类型的指针。用户保存执行现场。
CallbackStack:线程的回调栈地址,在从内核模式返回用户模式时用。
ServiceTable: 指向系统使用的系统服务表,非GUI线程为KeServiceDescriptorTable,GUI线程为KeServiceDescriptorTableShadow。
IdealProcess:理想处理器
Preempted:是否被高优先级线程抢占了。
ProcessReadyQueue:是否在进程对象的ReadyListHead列表中。
KernelStackResident:线程的内核栈是否驻留在线程中。
Affinity:处理器亲和性,为线程指定的处理器集合必须是该集合的子集。
UserAffinity:线程的用户亲和性。
Process:执行线程的进程对象。
ApcStateIndex:指明当前APC状态在ApcStatePointer域中的索引。
Win32Thread:指向Windows子系统管理的区域的指针。
SuspendApc/SuspendSemaphore:用于支持线程挂起的域。
ThreadListEntry:双链表的节点,线程被创建时,加入到进程的ThreadListHead链表中。
SListFaultAddress:上一次用户模式互锁单链表POP操作发生页面错误的地址。
SuspendSemaphore:与上面有关。
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。