微软推荐使用两台计算机,一台作为主计算机,用于运行调试器(如 WinDbg),另一台作为测试计算机,用于执行驱动程序。参考 Windows 调试入门。
本示例里,使用一台真实计算机作为主计算机,用于编写程序代码和运行 WinDbg,另外使用一台 VirtualBox 虚拟机作为测试计算机,VirtualBox 安装在主计算机上。
我们在主计算机上搭建开发环境,操作系统是 Win10 版本1809 64位,开发工具使用 VS2015,已安装好。下面安装 SDK 和 WDK。
由于微软使用了 WDK 版本与 SDK 和 Visual Studio 绑定的策略,既然确定了 Visual Studio 使用 VS2015,对于 SDK 和 WDK 版本就要配合 VS2015 才行。
进入 其他 WDK 下载 页面,在 第 1 步:安装 Visual Studio 里可以发现 VS2015 只适用于开发 Windows 10 版本 1703 和 Windows 10 版本 1607 的驱动程序。我们选择开发 Windows 10 版本 1703 的驱动程序,因此 SDK 和 WDK 都必须选择适用于 Windows 10 版本 1703 的。
同样在 第 1 步:安装 Visual Studio 里,选择下载 适用于 Windows 10.0.15063.468 的 Windows SDK 并安装。
同样在 其他 WDK 下载 页面,在 步骤 2:安装 WDK 里,选择下载 适用于 Windows 10 版本 1703 的 WDK 并安装。
我们决定安装一个 VirtualBox 虚拟机作为测试计算机。
到 www.virtualbox.org 下载 VirtualBox。
下载微软的软件,MSDN, 我告诉你 很方便,各种软件都有,但现在如果没有迅雷会员,并不是那么容易下得到了。
这里推荐一个网址 https://tb.rg-adguard.net/public.php?lang=zh-CN 也很不错。
下载到 Win10 ISO 后,创建一个 VirtualBox Win10 虚拟机,此处就不详述了。
首先声明,KDNET 不适用于 VirtualBox 虚拟机调试。
如果你想使用虚拟机,并且使用 KDNET 网络调试,可以参考 Setting Up Network Debugging of a Virtual Machine - KDNET,这篇文章介绍了使用微软自家 Hyper-V 虚拟机的方法。
本节内容仅是记录一下走过的弯路,如果你不感兴趣,可以直接跳到下一节。
之所以研究了 KDNET,是受了 编写第一个驱动程序 教程的误导。这个教程共有三篇文章,每篇文章在部署驱动程序一节,都让按照 预配计算机以便进行驱动程序部署和测试 (WDK 10) 中的说明进行操作。
ping ComputerName
。在测试计算机上,安装与测试计算机平台匹配的 WDK Test Target Setup MSI。该 MSI 可以在主计算机的 WDK 安装目录的 Remote 子目录中找到,如:C:\Program Files (x86)\Windows Kits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
,将该文件复制到测试计算机上运行。
在测试计算机上创建 C:\KDNET
目录。
在主计算机上找到 kdnet.exe
和 VerifiedNICList.xml
文件,将这两个文件复制到测试计算机的 C:\KDNET
目录。默认情况下,这两个文件位于此处:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64
在测试计算机上,以管理员身份打开命令提示符窗口。 输入 kdnet
命令以验证测试计算机是否具有支持的网络适配器。
由 kdnet
执行结果可见,VirtualBox 虚拟网卡不支持 NIC(network interface card),因此 VirtualBox 虚拟机不支持 KDNET 网络调试。
参见 自动设置 KDNET 网络内核调试
在 2016 年的一篇文章 Win10下VS2015(WDK10)驱动开发环境配置 里,在 5.2.2.2 设置测试目标计算机为网络调试方式
和 5.2.3.2 设置测试目标计算机为网络调试方式
节都描述了网络调试方法,似乎 VirtualBox 是支持网络调试的,但毕竟那是四年前了,现在 VirtualBox 和 Win10 的版本都升级了,也许新版本不再支持了吧。
网上讲到使用虚拟机进行内核调试的文章,介绍的一般都是串口调试,这也是我实际验证可行的方式。
虚拟机默认是不开启串口的,所以首先设置虚拟机串口。
如下图设置好虚拟机串口后,启动虚拟机。
以管理员身份打开命令提示符窗口,输入以下命令:
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200
由于我是先尝试的 KDNET,在配置 KDNET 时已经安装了 WDK Test Target,所以不确定 COM 调试是否也需要安装 WDK Test Target。
如果你想确认一下是否必须安装 WDK Test Target,可以先跳过这步,如果后面 WinDbg 无法连接,再回头来安装 WDK Test Target 也不迟。
在测试计算机上,安装与测试计算机平台匹配的 WDK Test Targe Setup MSI。该 MSI 可以在主计算机的 WDK 安装目录的 Remote 子目录中找到,如:C:\Program Files (x86)\Windows Kits\10\Remote\x64\WDK Test Target Setup x64-x64_en-us.msi
,将该文件复制到测试计算机上运行。
在主计算机上,打开【开始】菜单,在【Windows Kits】下面,找到 WinDbg (X64),点击运行。
在 WinDbg 窗口,点击菜单 File
>Kernel Debug...
,打开 Kernel Debugging 窗口,切换到 COM 页,如下图输入:
点击 确定 按钮,打开 Command 窗口。窗口内容显示:
Waiting for pipe \\.\pipe\com1
Waiting to reconnect...
重新启动测试计算机,当主计算机的 WinDbg 窗口中出现 Kernel Debugger connection established.
表示 WinDbg 与测试计算机连接成功。
在主计算机上,启动 VS2015。点击菜单 Driver > Test > Configure Devices...
打开 Configure Devices 窗口。
点击 Add New Device 按钮,打开 Device Configuration 对话框。
Network host name
框输入测试计算机的名称,然后点击 下一步。
Connection Type
选择 Serial,Baud Rate
、Pipe name
、Target Port
都按照测试计算机的配置输入,然后点击 下一步,开始配置测试计算机。
经过几分钟之后,期间测试计算机会有几次重启,配置完成,日志如下:
点击 下一步,显示配置结果如下:
虽然显示没有配置成功,但从上一步的日志可见,是创建系统还原点失败了,其它配置都成功了,这并不影响接下来的使用。
最后点击 完成 按钮,完成配置过程。配置完成后的 Configure Devices 窗口显示如下:
点击 OK 按钮,结束配置。
参考 基于模板编写通用 Windows 驱动程序 (KMDF) 创建驱动程序。
打开 > 新建 > 项目...
,打开新建项目对话框,创建内核模式驱动程序。x64
。生成 > 生成解决方案
,生成驱动程序。在“解决方案资源管理器” 窗口中,右键单击【KmdfDriver】项目,然后选择【属性】,打开 KmdfDriver 属性页 窗口。
在 KmdfDriver 属性页 窗口的左侧窗格中,选择 配置属性 > Driver Install > Deployment
。
Target Device Name: 选择在 VS2015 驱动测试配置 一节配置的 VirtualWin10
。
Driver Installation Options 选择 Hardware ID Driver Update
,硬件 ID 输入 Root\KmdfDriver
。然后单击确定。
在 生成
菜单上,选择 部署解决方案
。Visual Studio 会自动将安装和运行驱动程序所需的文件复制到测试计算机。此操作可能会需要一两分钟的时间。
检查是否部署成功。打开测试计算机的 C:\DriverTest\Drivers
文件夹,查看 KmdfDriver.inf
、KmdfDriver.sys
、kmdfdriver.cat
、KmdfDriver.cer
这几个文件是否存在。