本文记录了我在开发Windows驱动时的一些心得体会。

如何调试一个硬件驱动

可以使用DebugView工具查看驱动模块输出的调试信息。在勾选上DebugView的 Capture KernelEnable Verbose Kernel Output 菜单后,就能捕捉并显示驱动模块的调试信息。

在驱动代码中输出调试信息调用的接口为 kdPrintDbgPrint , 它们都能输出调试信息。区别是 kdPrint 输出的调试信息能够在发布版本的驱动中保留下来,即 release 版本的驱动也能够通过``kdPrint`` 输出调试信息;而 DbgPrint 输出的调试信息只会在调试版本(debug)的驱动中生效。

驱动签名

windows驱动需要经过数字签名后才能安装在操作系统中,在调试时可以绕过驱动签名的限制。使用下面的命令打开Windows系统的高级选项,然后重启电脑,再次开机时就会显示高级启动选项界面,选择“禁用强制驱动签名”菜单,这样进入系统后就能安装没有经过驱动签名的驱动了。

bcdedit /set advancedoptions on

关闭Windows系统的高级选项命令如下

bcdedit /set advancedoptions off

硬件设备只能用管理员权限打开

在驱动模块中会为硬件硬件设备起一个名字,应用层程序可以通过这个设备名字打开硬件。使用 WdfDeviceInitAssignName 指定的硬件名字只能用管理员权限打开,而 WdfDeviceCreateSymbolicLink 指定的硬件名字不需要管理员权限也能打开。

驱动的编译模式

我所使用的Windows驱动开发包的版本是7.1.0.7600,这是个比较老的驱动开发包,它在编译驱动时提供了两种模式: freechecked 。这两种模式可以简单的类比为应用层程序的 releasedebug

排查驱动导致的蓝屏

当操作系统出现蓝屏后,会在蓝屏界面显示错误信息,可以根据这个错误信息去微软官网寻找对应的错误说明。每次蓝屏后都会在 C:\Windows\minidump 目录中生成一个故障记录文件,文件的后缀为 *.dmp 。使用 BlueScreenView 工具打开 *.dmp 文件后能够读取到故障记录的更详细的信息。通过故障的错误码 bug check code 可以确定导致蓝屏的原因;通过故障参数 Parameter 可以辅助分析错误的详细原因;通过故障模块可以得知是哪个驱动导致的蓝屏。

(全文完)