线程结构体

ETHREAD

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

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//如果值为0,不能使用dr0~dr7,不能下硬件断点
+0x02d State : UChar//线程状态:就绪 = 2 等待 =5 运行
+0x02e Alerted : [2] UChar//数组 用户/内核模式下是否可以被唤醒
+0x030 Iopl : UChar KiInitializeUserApc 函数判断了这个值
+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//记录原先IRQL
+0x059 WaitMode : Char 如果是用户导致的等待 该值位1 不是就为0
+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 NtWaitForSingleObject设置了这个值 _KeTickCount.LowPart
+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 禁止运行内核APC
+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//附在线程的定时器 +8的位置保存的是 KTHREAD+0x070 WaitBlock的第4个成员的首地址
+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// 正常情况ApcStatePointer[0]指向ApcState ApcStatePointer[1] 指向SavedApcState 当前线程处于挂靠时相反 存的是_KTHREAD+0x34 和_KTHREAD+0x14c的地址
+0x140 PreviousMode : Char//(先前模式)某些内核函数会判断程序是0环调用还是3环调用的
+0x141 EnableStackSwap : UChar//本线程内核栈是否允许被换出到外储存
+0x142 LargeStack : UChar
+0x143 ResourceIndex : UChar
+0x144 KernelTime : Uint4B
+0x148 UserTime : Uint4B
+0x14c SavedApcState : _KAPC_STATE//APC相关
+0x164 Alertable : UChar//线程是否可以被唤醒
+0x165 ApcStateIndex : UChar// 正常状态 0 挂靠状态1
+0x166 ApcQueueable : UChar//是否可以插入APC 1 可以 0 不可以
+0x167 AutoAlignment : UChar//
+0x168 StackBase : Ptr32 Void//当前栈的基址(高地址)(线程切换相关)
+0x16c SuspendApc : _KAPC//挂起APC (163)
+0x19c SuspendSemaphore : _KSEMAPHORE//信号量状态
+0x1b0 ThreadListEntry : _LIST_ENTRY 双向链表,一个进程所有的线程都挂在一个链表中
,一共有两个这样的链表 链表指向ETHREAD+0x1b0的位置
+0x1b8 FreezeCount : 在调用SuspendThread时,SuspendCount 自加1;如果大于0表示挂起了。调用ResumeThread时,SuspendCount 自减1;如果等于0,系统会恢复线程。
当挂起和恢复时,FreezeCount必须为0,否则挂起和恢复操作都直接pass了 .所以,可以修改 SuspendCount 和 FreezeCount来达到反挂起的目的。
+0x1b9 SuspendCount : Char//当调试器调试目标进程,被中断时,由于目标进程线程的SuspendCount不为零,所以目标进程的线程就无法被暂停。
+0x1ba IdealProcessor : UChar
+0x1bb DisableBoost : UChar//

在这里插入图片描述
在这里插入图片描述
KernelStack 记录切换线程时 0环的esp位置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值