Re: xp windbg 当前IRQL

Windows内核调试

xp windbg 当前IRQL


lazyworm 2010-03-09, 15:36 下午
在XP中的某个内核函数下段后,用!PCR得到的当前的IRQL,MSDN这样描述(

One of the entries in this display shows the interrupt request level (IRQL). The !pcr extension shows the current IRQL, but the current IRQL is usually not of much interest. The IRQL that existed just before the bug check or debugger connection is more interesting. ),  我猜测这样得到的IRQL 并不是这个函数执行时的IRQL,而是windbg中断后 系统的IRQL, 我想得到当前的IRQL, 系统函数 不方便调用 KeGetCurrentIrql ,请问下有其他方法吗? 

 

PS:点论坛搜索功能 按钮 ,貌似没反应

Re: xp windbg 当前IRQL


格蠹老雷 2010-03-09, 19:44 下午
这是个老生常谈的问题,对于XP没有什么好办法,对于Server 2003开始的系统,可以使用!irql
命令:
kd> !irql 1
Debugger saved IRQL for processor 0x1 -- 0 (LOW_LEVEL)

Re: xp windbg 当前IRQL


王宇 2010-03-09, 21:40 下午
page ,132
subttl "Get current irql"

;++
;
; KIRQL
; KeGetCurrentIrql (VOID)
;
; Routine Description:
;
; This routine returns to current IRQL.
;
; Arguments:
;
; None.
;
; Return Value:
;
; The current IRQL.
;
;--

cPublicProc _KeGetCurrentIrql ,0
cPublicFpo 0, 0

movzx eax, byte ptr PCR[PcIrql] ; Current irql is in the PCR
stdRET _KeGetCurrentIrql
stdENDP _KeGetCurrentIrql

调试器直接看一下即可 ( 针对某个核 )

Re: xp windbg 当前IRQL


格蠹老雷 2010-03-10, 13:46 下午
呵呵,王宇误解了。

PCR里看到的还是已经被KD提升过的,永远是HIGH_LEVEL;LZ想看到的是KD介入前,在要调试的目标函数里时的IRQL。

2K3后,故意加了个字段,来保存IRQL的前一个值。

Re: xp windbg 当前IRQL


lazyworm 2010-03-10, 15:54 下午
还是学到不少 ,谢谢 两位的回复

Re: xp windbg 当前IRQL


王宇 2010-03-10, 18:35 下午
多谢张老师!确认了一下 Kernel Debug 确实会影响 IRQL

^_^

Re: xp windbg 当前IRQL


SuperMouse 2010-04-08, 19:03 下午
有一个名为 KiOldIrql 的全局变量,在 KeFreezeExecution 把 IRQL 提升到 HIGH_LEVEL 的时候会把原先的 IRQL 保存在这个变量里。

Re: xp windbg 当前IRQL


格蠹老雷 2010-04-08, 22:24 下午

To SuperMouse,

Good point!但是这个变量一直没有导出,很长一段时间内也没有“回放”到公开符号中,所以对于早期的XP版本,要用这个变量也不太容易。首先很多人不知道这个变量,知道了也不知道它的地址。

新版本的公开符号文件中包含这个符号了,比如XP的SP3也如此。

91810 0x5  0x124618 0x124618  KiOldIrql  7 91811 91812

因此对于这些新版本,是可以观察这个全局变量,但是对于多处理器来说,还是有问题,全局变量只有一个,处理器有多个,因此全局变量记录的只是作为发起这次break的那个CPU的原本IRQL。   

为了根本解决这个问题,在Svr 2003时,在KPRCB结构中加了一个字段DebuggerSavedIRQL来专门保存旧的IRQL。并增加了一个!irql命令。如果针对SVR2K3之前的目标执行时会看到:

kd> !irql
nt!_KPRCB.DebuggerSavedIRQL not found, error : 0x4.
Saved IRQL not available prior to Windows Server 2003

归纳一下,对于XP SP1或者更老的目标,那么可用的方法在0和1之间,看是否有私有符号,或者是否有耐心通过看汇编,找到KiOldIrql的地址。

对于Svr2K3开始的目标,可以用2-3种方法,看KiOldIrql变量,观察_KPRCB.DebuggerSavedIRQL和执行!irql(后两种等价)。比如,下面是针对Win7目标的执行结果:

kd> dd nt!kioldirql l1
831717c4  0000001c

kd> dt _KPRCB 8313cd20 -y Debug
nt!_KPRCB
   +0x4c4 DebuggerSavedIRQL : 0x1c ''

 kd> !irql
Debugger saved IRQL for processor 0x0 -- 28 (CLOCK2_LEVEL)

 

 

Powered by Community Server Powered by CnForums.Net