• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

WinDbg工具接收不到KdPrint的输出信息的原因与解决方法

WinDbg 菜鸟 7个月前 (02-15) 2116次浏览 已收录 0个评论
[隐藏]

1. 前言

        之前调试时一直是用 Debug View 来看,虽然它也能将 Debug 信息传给 WinDbg,但经常还有一大串其他的内核信息刷屏,当时只顾着调试问题,没有具体去做配置。

        今天我们就一起来实现不用 Debug View 还能让 WinDbg 收到 KdPrint 的输出信息,而且我们也看一下 WinDbg 收不到 KdPrint 信息的原因。

2. 概念

        菜鸟取翻了下 MSDN,原来这输出信息还是有讲究的..是从 Vista 以后才开始根据条件来进行区分输出的。这些打印内核信息的函数或宏都要传递两个参数,ComponentIdLevel

        然后如果有一个内核调试器附加到你的系统上了,你打印调试信息时,系统会检查ComponentIdLevel是否与系统的过滤掩码一致,一致的话就发送给内核调试器,否则就不发送。

所以 WinDbg 能否收到内核调试信息是要看两个方面:
        1. 打印内核调试信息是设置的ComponentIdLevel
        2. 系统设置的过滤掩码。

2.1. ConponentId

组件 ID 是根据组件名称来得,只是在不同的地方其前后缀可能会有差异。
比如,调试函数和宏使用的话就是”DPFLTR_ 组件名称 _ID”后缀。注册表使用就直接是组件名,调试器用的话就是”Kd_ 组件名称 _Mask”,这些需要注意一下。
不同的驱动类型使用不同的组件名称:

组件名 驱动类型
IHVVIDEO Video
IHVAUDIO Audio
IHVNETWORK Network
IHVSTREAMING Kernel streaming
IHVBUS Bus
IHVDRIVER 其他类型

示例:有一个网络驱动,那打印内核调试信息时 ConponentId 就使用DPFLTR_IHVNETWORK_ID。由此可以控制要显示哪类驱动的调试信息。
KdPrintComponentId是默认的DPFLTR_DEFAULT_ID

2.2. Level

用位域来决定等级。分两种情况:
        1. [0, 31],会被解释成 1 << Level,注意如果是 0 的话则为 0x00000001。
        2. [32, 0xFFFFFFFF],不做位移,直接使用其值作为位域。

可以根据自己的需要设置 level 来控制要显示哪些信息,下面是 WDK 定义的一些 Level:

#define DPFLTR_ERROR_LEVEL 0
#define DPFLTR_WARNING_LEVEL 1
#define DPFLTR_TRACE_LEVEL 2
#define DPFLTR_INFO_LEVEL 3
#define DPFLTR_MASK 0x80000000

KdPrintLevel是默认的DPFLTR_INFO_LEVEL

2.3 过滤掩码

在注册表中位于HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter
值名称就是 Conponent 名称,而值就是 level。
WinDbg 工具接收不到 KdPrint 的输出信息的原因与解决方法

3. 解决方法

3.1. 修改注册表

先查看 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter,
如果 KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager 下没有 Debug Print Filter 则手工创建,然后按自己的需要添加值。

3.2. Kd 修改

ed kd_ 组件名称 _Mask 等级
注意:在调试器中修改,效果只持续到目标计算机重启。

效果:
WinDbg 工具接收不到 KdPrint 的输出信息的原因与解决方法

4. 小结

        所以,以后我们不能贪图省事是用 KdPrint,而是根据实际需求,养成使用 KdPrintEx 设置 ConponentId 和 level 的习惯,这样的话在调试阶段就会方便、省心很多。
        那这次就先这样啦。Happy Coding~^_^


学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明WinDbg 工具接收不到 KdPrint 的输出信息的原因与解决方法
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址