You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM64版Windows 11中KeGetCurrentIrql调试x18寄存器值异常问题

关于ARM64 Windows 11中KeGetCurrentIrql调试时x18寄存器为0的问题

首先纠正你的核心误解:ARM64 Windows的内核态下,x18寄存器指向的是当前处理器的KPCR(Kernel Processor Control Region,内核处理器控制区),而非用户态的TEB。TEB是用户态线程的环境块,仅在用户态执行时由x18寄存器指向;内核态里x18的用途完全不同,KeGetCurrentIrql的指令ldrb w0, [x18, #0x38],读取的是KPCR偏移0x38处的CurrentIrql字段,和TEB没有任何关联。

你调试时看到x18=0,主要是以下原因:

  • 你处于调试器中断上下文:当WinDbg通过内核调试打断系统时,处理器会切换到调试器的处理流程,此时目标线程的寄存器(包括x18)会被保存到栈中,当前x18的值是调试上下文的临时值(可能被清零),并非目标线程运行时的真实x18。解决方法很简单:用~命令列出所有线程,再用~[线程ID] s切换到目标线程的上下文,之后执行r x18就能看到正确的KPCR地址。
  • 极少数情况是断在了内核初始化早期代码或特殊中断上下文,此时KPCR还未被加载到x18,但这种情况在Windows 11正常运行阶段几乎不会遇到。

至于!teb命令能正常获取TEB地址,这是因为!teb显示的是当前线程的用户态TEB地址,它来自内核KTHREAD结构的Teb成员,和内核态x18指向的KPCR完全是两个独立的结构,所以两者数值不冲突是正常的。

可以用以下方法验证:切换到正常内核线程后,执行r x18得到KPCR地址,再用db x18+0x38 L1读取该地址的字节,结果应该和!irql命令显示的当前IRQL完全一致。

内容的提问来源于stack exchange,提问作者c00000fd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 01:42:48