DriverEntry调用KeGetCurrentThread后WinDbg显示WaitPrcb为null的问题
关于_KTHREAD的WaitPrcb成员为null的问题分析
你的操作场景
你在WDF内核驱动的DriverEntry中编写了以下代码:
_KTHREAD* pKthread = KeGetCurrentThread(); DbgPrintEx(DPFLTR_SYSTEM_ID, DPFLTR_ERROR_LEVEL, "[ProcessSwitch...] pKTHREAD = %p\n", pKthread);
通过DebugView获取线程地址后,在WinDbg中执行命令:
dt _KTHREAD 0xFFFFA80000050000
发现该_KTHREAD结构体的WaitPrcb成员为(null)。
原因分析
- WaitPrcb的作用:这个成员仅在线程处于等待调度状态时,才会指向对应的处理器控制块(PRCB)。如果线程当前正在运行,
WaitPrcb就会是null。 - DriverEntry的执行状态:
DriverEntry是驱动加载时由系统线程执行的,此时该线程正处于运行态,并没有在等待被调度,所以WaitPrcb自然为空,这是正常现象,不是你的操作错误。 - 误区说明:你获取的是当前正在运行的线程地址,运行中的线程不需要等待调度,因此这个成员不会有有效值。
验证方法(可选)
如果想看到WaitPrcb有值的情况,可以:
- 在驱动中创建一个工作项线程,让它等待一个未触发的事件,然后输出该线程的地址,再用WinDbg查看,此时
WaitPrcb会指向对应的PRCB。 - 用WinDbg的
!thread命令先确认目标线程的状态,只有处于等待态的线程,WaitPrcb才会有值。
内容的提问来源于stack exchange,提问作者JkT
相关产品推荐
相关产品推荐

