开发windows驱动,通常调试驱动的方法是在主机上编写代码编译通过,将sys和inf拿到被调试机台上安装测试,主机通过windbg连上调试机台。当代码有改动时,将编译好的驱动再拿到被调试机台上安装测试。每次都拷贝到调试机台上安装驱动这个动作有点繁琐,一次操作最快也需要一两分钟,一个大型的驱动从开始开发都开发结束,中间可能有长达上千次的调试过程。光这个复制安装动作就有2000多分钟,这是一笔巨大的时间开支。
有没有好的方法可以节省这个时间呢,答案是有的。
这篇文章就介绍一个省去每次的拷贝动作,让在主机上编译好驱动就可以直接在调试机上进行调试的方法。
方法的核心是需要用到windbg的 .kdfiles命令。
.kdfiles命令是什么呢?这里给出官方介绍链接:https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/-kdfiles--set-driver-replacement-map-
一句话总结在本方法此命令的作用就是通过在主机上设定一个驱动映射的配置文件,重启调试机时windbg会自动将调试机上的某个驱动给替换成主机上指定的驱动。
假设驱动编译出来的sys文件为: D:\DriverStudy\debug\test.sys,驱动一般安装后会在system32\drivers目录下。则此方法的配置步骤为:
1、在调试主机上编写一个ini配置文件,比如取名叫 drv_map.ini,放在D:\DriverStudy 目录下(具体位置可以放在你电脑上任意位置)。
2、drv_map.ini配置文件内容如下:
map
\Systemroot\system32\drivers\test.sys
D:\DriverStudy\debug\test.sys
3、调试主机上新增一个环境变量,环境变量名:_NT_KD_FILES,值填写drv_map.ini所在的目录,我的环境如下图所示:
4、windbg通过网络连接连上调试机。
5、每次编译好驱动后,直接重启调试机,重启后系统就会加载新编译出来的驱动了。成功加载驱动时会输出如下信息:
KDFILES: Replacing '\SystemRoot\system32\DRIVERS\test.sys' with 'D:\DriverStudy\debug\test.sys'. File size 394KB.
KdPullRemoteFile(FFFFDC0F6D668380): About to overwrite \SystemRoot\system32\DRIVERS\test.sys and preallocate to 62690
KdPullRemoteFile(FFFFDC0F6D668380): Return from ZwCreateFile with status 0