背景
在驱动开发调试过程中,经常用到需要查看输出。最简单的方式就是采用 DebugView(DbgView.exe)来查看输出。
准备
- DbgView.exe 存在于 Sysinternals Suit 中,通常只需要下载 Sysinternals Suit 中即可。详情可参考:Sysinternals Suite - Windows Sysinternals | Microsoft Docs
- 在注册表的 HKLMSYSTEMCurrentControlSetControlSession Manager 下增加一个 Debug Print Filter 的键(这个键通常不存在)。在新建的键中,添加一个 DEFAULT 的 DWORD 值,并将其值设置为 8(理论上说,只要位3置位的任意值均可)。—-Windows Vista 后的系统都需要。如下图
- 重启!重启!重启!
- 对于驱动而言,需要使用管理员权限打开 DbgView.exe,并且在 Capture 中勾选上 Capture Kernel。最好不要选中Capture Win32和Capture Global Win32,这样来自各个进程的输出不会搞乱显示。
代码输出打印
在驱动中,可通过 KdPrint 宏的方式来打印。如:
KdPrint(("Driver unload calledn"));
KdPrint 实际会在 DBG 下通过调用 DbgPrint 来输出,所以后面的参数跟 printf 保持一致即可。定义如下:
需要注意:KdPrint 后会跟两层括号,是因为宏不支持不定参数,所以通过这种骚操作来绕过。
#if DBG
#define KdPrint(_x_) DbgPrint _x_
#else
#define KdPrint(_x_)
#endif
💡 如果没有打印,应该是内核调试输出未开启。通过 ed nt!Kd_DEFAULT_MASK 0xffffffff 开启。
0