VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)

目录

  • 开发及测试环境配置
    • 主计算机环境配置
    • 测试计算机环境配置
  • 搭建开发环境
    • 下载并安装 SDK
    • 下载并安装 WDK
  • 搭建测试环境
    • 下载并安装 VirtualBox
    • 下载并安装 Win10 虚拟机
    • 设置 KDNET 网络内核调试
      • 1、主计算机和测试计算机必须能够互相按名称 ping 通
      • 2、安装 WDK Test Target
      • 3、使用 kdnet.exe 在测试计算机上自动配置调试器设置
      • 4、也许曾经支持
    • 设置 COM 端口内核调试
      • 1、设置虚拟机串口
      • 2、使用 BCDEdit 更改启动信息
      • 3、是否需要安装 WDK Test Target
    • 使用 WinDbg 启动调试会话
  • VS2015 驱动测试配置
  • 编写第一个驱动程序
    • 创建驱动程序
    • 部署驱动程序
    • 调试驱动程序

开发及测试环境配置

微软推荐使用两台计算机,一台作为主计算机,用于运行调试器(如 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 版本 1703Windows 10 版本 1607 的驱动程序。我们选择开发 Windows 10 版本 1703 的驱动程序,因此 SDK 和 WDK 都必须选择适用于 Windows 10 版本 1703 的。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第1张图片
同样在 第 1 步:安装 Visual Studio 里,选择下载 适用于 Windows 10.0.15063.468 的 Windows SDK 并安装。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第2张图片

下载并安装 WDK

同样在 其他 WDK 下载 页面,在 步骤 2:安装 WDK 里,选择下载 适用于 Windows 10 版本 1703 的 WDK 并安装。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第3张图片

搭建测试环境

我们决定安装一个 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 虚拟机网络,使其能够与主计算机通信。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第4张图片
  • 要使主计算机与测试计算机能够互相 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.exeVerifiedNICList.xml 文件,将这两个文件复制到测试计算机的 C:\KDNET 目录。默认情况下,这两个文件位于此处:
    C:\Program Files (x86)\Windows Kits\10\Debuggers\x64

  • 在测试计算机上,以管理员身份打开命令提示符窗口。 输入 kdnet 命令以验证测试计算机是否具有支持的网络适配器。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第5张图片
    kdnet 执行结果可见,VirtualBox 虚拟网卡不支持 NIC(network interface card),因此 VirtualBox 虚拟机不支持 KDNET 网络调试。

  • 参见 自动设置 KDNET 网络内核调试

4、也许曾经支持

在 2016 年的一篇文章 Win10下VS2015(WDK10)驱动开发环境配置 里,在 5.2.2.2 设置测试目标计算机为网络调试方式5.2.3.2 设置测试目标计算机为网络调试方式 节都描述了网络调试方法,似乎 VirtualBox 是支持网络调试的,但毕竟那是四年前了,现在 VirtualBox 和 Win10 的版本都升级了,也许新版本不再支持了吧。

设置 COM 端口内核调试

网上讲到使用虚拟机进行内核调试的文章,介绍的一般都是串口调试,这也是我实际验证可行的方式。

1、设置虚拟机串口

虚拟机默认是不开启串口的,所以首先设置虚拟机串口。
如下图设置好虚拟机串口后,启动虚拟机。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第6张图片

2、使用 BCDEdit 更改启动信息

以管理员身份打开命令提示符窗口,输入以下命令:

bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200

VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第7张图片

  • 参考 Setting Up Kernel-Mode Debugging of a Virtual Machine Manually using a Virtual COM Port

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 页,如下图输入:
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第8张图片
点击 确定 按钮,打开 Command 窗口。窗口内容显示:

Waiting for pipe \\.\pipe\com1
Waiting to reconnect...

VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第9张图片

重新启动测试计算机,当主计算机的 WinDbg 窗口中出现 Kernel Debugger connection established. 表示 WinDbg 与测试计算机连接成功。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第10张图片

VS2015 驱动测试配置

在主计算机上,启动 VS2015。点击菜单 Driver > Test > Configure Devices... 打开 Configure Devices 窗口。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第11张图片

VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第12张图片
点击 Add New Device 按钮,打开 Device Configuration 对话框。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第13张图片
Network host name 框输入测试计算机的名称,然后点击 下一步。
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第14张图片
Connection Type 选择 SerialBaud RatePipe nameTarget Port 都按照测试计算机的配置输入,然后点击 下一步,开始配置测试计算机。

经过几分钟之后,期间测试计算机会有几次重启,配置完成,日志如下:
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第15张图片
点击 下一步,显示配置结果如下:
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第16张图片
虽然显示没有配置成功,但从上一步的日志可见,是创建系统还原点失败了,其它配置都成功了,这并不影响接下来的使用。

最后点击 完成 按钮,完成配置过程。配置完成后的 Configure Devices 窗口显示如下:
VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第17张图片
点击 OK 按钮,结束配置。

编写第一个驱动程序

参考 基于模板编写通用 Windows 驱动程序 (KMDF) 创建驱动程序。

创建驱动程序

  1. 启动 Visual Studio 2015,点击菜单 打开 > 新建 > 项目...,打开新建项目对话框,创建内核模式驱动程序。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第18张图片
  2. 在“解决方案资源管理器” 窗口中,右键单击【解决方案"KmdfDriver"(1 个项目)】,然后选择“配置管理器…” ,打开 配置管理器 窗口。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第19张图片
  3. 更改解决方案平台为 x64
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第20张图片
  4. 点击菜单 生成 > 生成解决方案,生成驱动程序。
    在这里插入图片描述

部署驱动程序

  1. 在“解决方案资源管理器” 窗口中,右键单击【KmdfDriver】项目,然后选择【属性】,打开 KmdfDriver 属性页 窗口。

  2. KmdfDriver 属性页 窗口的左侧窗格中,选择 配置属性 > Driver Install > Deployment
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第21张图片

  3. Target Device Name: 选择在 VS2015 驱动测试配置 一节配置的 VirtualWin10

  4. Driver Installation Options 选择 Hardware ID Driver Update,硬件 ID 输入 Root\KmdfDriver。然后单击确定。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第22张图片

  5. 生成 菜单上,选择 部署解决方案。Visual Studio 会自动将安装和运行驱动程序所需的文件复制到测试计算机。此操作可能会需要一两分钟的时间。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第23张图片

  6. 检查是否部署成功。打开测试计算机C:\DriverTest\Drivers 文件夹,查看 KmdfDriver.infKmdfDriver.syskmdfdriver.catKmdfDriver.cer 这几个文件是否存在。

调试驱动程序

  1. 点击菜单 调试 > 附加到进程...,打开 附加到进程 对话框。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第24张图片

  2. 传输 选择 Windows Kernel Mode Debugger

  3. 限定符 选择在 VS2015 驱动测试配置 一节配置的 VirtualWin10

  4. 可用进程 列表里选择 Kernel 进程。

  5. 点击 附加 按钮启动调试。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第25张图片

  6. 点击 附加 按钮后,VS2015 进入调试状态,Debugger Immediate Window 窗口显示如下:
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第26张图片

  7. 重新启动测试计算机,当 VS2015 的调试窗口中出现 Kernel Debugger connection established. 表示 VS2015 与测试计算机连接成功。
    VirtualBox Win10 Kernel mode 驱动开发环境搭建(VS2015)_第27张图片
    VS2015 集成了 Windows 调试器,在 VS2015 中不仅可完成编码、构建、打包工作,还可实现驱动程序的部署、调试、测试。参见 Visual Studio 中使用集成 Windows 调试器。

你可能感兴趣的:(driver,WDF)