开发及测试环境配置
微软推荐使用两台计算机,一台作为主计算机,用于运行调试器(如 WinDbg),另一台作为测试计算机,用于执行驱动程序。参考 Windows 调试入门。
本示例里,使用一台真实计算机作为主计算机,用于编写程序代码和运行 WinDbg,另外使用一台 VirtualBox 虚拟机作为测试计算机,VirtualBox 安装在主计算机上。
主计算机环境配置
- 操作系统:Windows 10 版本1809 64位
- 开发工具:Visual Studio 2015
测试计算机环境配置
- 虚拟机:VirtualBox 6.0.14
- 操作系统:Windows 10 版本1903 64位
搭建开发环境
我们在主计算机上搭建开发环境,操作系统是 Win10 版本1809 64位,开发工具使用 VS2015,已安装好。下面安装 SDK 和 WDK。
由于微软使用了 WDK 版本与 SDK 和 Visual Studio 绑定的策略,既然确定了 Visual Studio 使用 VS2015,对于 SDK 和 WDK 版本就要配合 VS2015 才行。
下载并安装 SDK
进入 其他 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
同样在 其他 WDK 下载 页面,在 步骤 2:安装 WDK 里,选择下载 适用于 Windows 10 版本 1703 的 WDK 并安装。
搭建测试环境
我们决定安装一个 VirtualBox 虚拟机作为测试计算机。
下载并安装 VirtualBox
到 www.virtualbox.org 下载 VirtualBox。
下载并安装 Win10 虚拟机
下载微软的软件,MSDN, 我告诉你 很方便,各种软件都有,但现在如果没有迅雷会员,并不是那么容易下得到了。
这里推荐一个网址 https://tb.rg-adguard.net/public.php?lang=zh-CN 也很不错。
下载到 Win10 ISO 后,创建一个 VirtualBox Win10 虚拟机,此处就不详述了。
设置 KDNET 网络内核调试
首先声明,KDNET 不适用于 VirtualBox 虚拟机调试。
如果你想使用虚拟机,并且使用 KDNET 网络调试,可以参考 Setting Up Network Debugging of a Virtual Machine - KDNET,这篇文章介绍了使用微软自家 Hyper-V 虚拟机的方法。
本节内容仅是记录一下走过的弯路,如果你不感兴趣,可以直接跳到下一节。
之所以研究了 KDNET,是受了 编写第一个驱动程序 教程的误导。这个教程共有三篇文章,每篇文章在部署驱动程序一节,都让按照 预配计算机以便进行驱动程序部署和测试 (WDK 10) 中的说明进行操作。
1、主计算机和测试计算机必须能够互相按名称 ping 通
- 首先设置 VirtualBox 虚拟机网络,使其能够与主计算机通信。
- 要使主计算机与测试计算机能够互相 ping 通,还需要关闭主计算机和测试计算机的防火墙。
- 验证主计算机和测试计算机是否可以互相 ping 通。打开命令提示符窗口,并输入
ping ComputerName
。
2、安装 WDK Test Target
在测试计算机上,安装与测试计算机平台匹配的 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
,将该文件复制到测试计算机上运行。
3、使用 kdnet.exe 在测试计算机上自动配置调试器设置
-
在测试计算机上创建
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 网络调试。
4、也许曾经支持
在 2016 年的一篇文章 Win10下VS2015(WDK10)驱动开发环境配置 里,在 5.2.2.2 设置测试目标计算机为网络调试方式
和 5.2.3.2 设置测试目标计算机为网络调试方式
节都描述了网络调试方法,似乎 VirtualBox 是支持网络调试的,但毕竟那是四年前了,现在 VirtualBox 和 Win10 的版本都升级了,也许新版本不再支持了吧。
设置 COM 端口内核调试
网上讲到使用虚拟机进行内核调试的文章,介绍的一般都是串口调试,这也是我实际验证可行的方式。
1、设置虚拟机串口
虚拟机默认是不开启串口的,所以首先设置虚拟机串口。
如下图设置好虚拟机串口后,启动虚拟机。
2、使用 BCDEdit 更改启动信息
以管理员身份打开命令提示符窗口,输入以下命令:
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200
3、是否需要安装 WDK Test Target
由于我是先尝试的 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
,将该文件复制到测试计算机上运行。
使用 WinDbg 启动调试会话
在主计算机上,打开【开始】菜单,在【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 驱动测试配置
在主计算机上,启动 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) 创建驱动程序。
创建驱动程序
- 启动 Visual Studio 2015,点击菜单
打开 > 新建 > 项目...
,打开新建项目对话框,创建内核模式驱动程序。
- 在“解决方案资源管理器” 窗口中,右键单击【解决方案"KmdfDriver"(1 个项目)】,然后选择“配置管理器…” ,打开 配置管理器 窗口。
- 更改解决方案平台为
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
这几个文件是否存在。
调试驱动程序
-
点击菜单
调试 > 附加到进程...
,打开 附加到进程 对话框。
-
传输 选择
Windows Kernel Mode Debugger
。 -
限定符 选择在 VS2015 驱动测试配置 一节配置的
VirtualWin10
。 -
在 可用进程 列表里选择
Kernel
进程。 -
点击 附加 按钮启动调试。
-
点击 附加 按钮后,VS2015 进入调试状态,Debugger Immediate Window 窗口显示如下:
-
重新启动测试计算机,当 VS2015 的调试窗口中出现
Kernel Debugger connection established.
表示 VS2015 与测试计算机连接成功。
VS2015 集成了 Windows 调试器,在 VS2015 中不仅可完成编码、构建、打包工作,还可实现驱动程序的部署、调试、测试。参见 Visual Studio 中使用集成 Windows 调试器。