Advanced Debugging
About AdvDbg Consult Train Services Products Tools Community Contact  
欢迎光临 高端调试 登录 | 注册 | FAQ
 
  ACPI调试
Linux内核调试
Windows内核调试
 
  调试战役
调试原理
新工具观察
 
  Linux
Windows Vista
Windows
 
  Linux驱动
WDF
WDM
 
  PCI Express
PCI/PCI-X
USB
无线通信协议
 
  64位CPU
ARM
IA-32
  CPU Info Center
 
  ACPI标准
系统认证
Desktop
服务器
 
  Embedded Linux
嵌入式开发工具
VxWorks
WinCE
嵌入式Windows
 
  格蠹调试套件(GDK)
  格蠹学院
  小朱书店
  老雷的微博
  《软件调试》
  《格蠹汇编》
  《软件调试(第二版)》
沪ICP备11027180号-1

Windows内核调试

帖子发起人: lazyworm   发起时间: 2010-03-09 15:36 下午   回复: 7

Print Search
帖子排序:    
   2010-03-09, 15:36 下午
lazyworm 离线,最后访问时间: 2016/9/26 10:56:37 lazyworm

发帖数前50位
注册: 2009-06-04
发 贴: 22
xp windbg 当前IRQL
Reply Quote
在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:点论坛搜索功能 按钮 ,貌似没反应


IP 地址: 已记录   报告
   2010-03-09, 19:44 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: xp windbg 当前IRQL
Reply Quote
这是个老生常谈的问题,对于XP没有什么好办法,对于Server 2003开始的系统,可以使用!irql
命令:
kd> !irql 1
Debugger saved IRQL for processor 0x1 -- 0 (LOW_LEVEL)
IP 地址: 已记录   报告
   2010-03-09, 21:40 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: xp windbg 当前IRQL
Reply Quote
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

调试器直接看一下即可 ( 针对某个核 )
IP 地址: 已记录   报告
   2010-03-10, 13:46 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: xp windbg 当前IRQL
Reply Quote
呵呵,王宇误解了。

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

2K3后,故意加了个字段,来保存IRQL的前一个值。
IP 地址: 已记录   报告
   2010-03-10, 15:54 下午
lazyworm 离线,最后访问时间: 2016/9/26 10:56:37 lazyworm

发帖数前50位
注册: 2009-06-04
发 贴: 22
Re: xp windbg 当前IRQL
Reply Quote
还是学到不少 ,谢谢 两位的回复
IP 地址: 已记录   报告
   2010-03-10, 18:35 下午
WANGyu 离线,最后访问时间: 2012/9/10 3:34:00 王宇

发帖数前10位
男
注册: 2007-05-08
发 贴: 306
Re: xp windbg 当前IRQL
Reply Quote
多谢张老师!确认了一下 Kernel Debug 确实会影响 IRQL

^_^
IP 地址: 已记录   报告
   2010-04-08, 19:03 下午
louyihua 离线,最后访问时间: 2014/11/22 12:40:40 SuperMouse

发帖数前150位
注册: 2008-10-31
发 贴: 8
Re: xp windbg 当前IRQL
Reply Quote
有一个名为 KiOldIrql 的全局变量,在 KeFreezeExecution 把 IRQL 提升到 HIGH_LEVEL 的时候会把原先的 IRQL 保存在这个变量里。
IP 地址: 已记录   报告
   2010-04-08, 22:24 下午
Raymond 离线,最后访问时间: 2020/7/3 3:40:25 格蠹老雷

发帖数前10位
注册: 2005-12-19
发 贴: 1,303
Re: xp windbg 当前IRQL
Reply Quote

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)

 

 


IP 地址: 已记录   报告
高端调试 » 软件调试 » Windows内核调试 » Re: xp windbg 当前IRQL

 
Legal Notice Privacy Statement Corporate Governance Corporate Governance
(C)2004-2020 ADVDBG.ORG All Rights Reserved.