我正在尝试使用 Windows 11 的 ARM 版本来找出 ARM64 架构。我可以看到 KeGetCurrentIrql 函数转换为:
ldrb w0, [xpr, #0x38]
ret
如果我理解正确的话,
xpr
寄存器是x18
,因此ldrb
指令从x18
寄存器获取的内存地址读取一个字节,加上0x38
偏移量。
因此,当我在
ldrb
指令上触发断点时,我在 WinDbg 中尝试以下操作:
kd> r x18
x18=0000000000000000
但是怎么可能,
x18
是0呢? TEB 不能为 0。我错过了什么?
如果我这样做:
kd> !teb
TEB at 0000003d7af95000
...
x18 在用户模式下指向 TEB,在内核模式下指向 KPCR。
一年多前我也看到过这种行为,就我而言,这是 WinDbg 中的一个错误,我通过编写一个驱动程序来输出 x18 的实际值来验证这实际上是一个错误。
您可以通过使用参数为 18 的 __getReg 内在函数来做到这一点,如下所示:
无符号长长 x18 = __getReg(18);