windows驱动开发3:第一个驱动及调试

一、创建项目

新建一个以Kernel Mode Driver, Empty(KMDF)为模板的驱动项目,项目名称HelloDriver,在项目中新建一个hello.cpp文件作为驱动入口文件,写一点简单的代码做测试:
hello.cpp代码:
#include <ntddk.h>
// 提供一个Unload 函数只是为了让这个程序能够动态卸载,方便调试
extern "C" void DriverUnload( PDRIVER_OBJECT driver)
{
    // 但是实际上我们什么都不做,只打印一句话
    DbgPrint( "hello: my driver is unloading...\r\n");
}
// DriverEntry,入口函数。相当于main。
extern "C" NTSTATUS DriverEntry( PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
    // 这是内核模块入口,可以在这里写入我们想写的东西
    DbgPrint( "hello: my world!");
    // 设置一个卸载函数,便于这个函数退出
    driver-> DriverUnload = DriverUnload;
    return STATUS_SUCCESS;
}
修改告警:调整属性 - C/C++ - 常规,警告等级 4,将警告视为错误 否;

二、编译及测试

  • 根据目标机器,选择x86/x64编译
  • 拷贝:KMDFDriver1.sys、KMDFDriver1.cer、KMDFDriver1.inf到测试机器
  • 测试机器打开驱动测试(驱动需要正规签名才能使用,而测试程序没有签名)
bcdedit /debug on
bcdedit /bootdebug on                 // boot 驱动需要此设置
bcdedit /set testsigning on            // 使用测试签名可用,和禁用签名功能类似
  • 测试机器打开debugview,需要配置收集内核驱动信息
  • 利用驱动加载工具,安装驱动
  • 安装服务后,启动和停止驱动,即可看到对应的调试信息。至此完成第一个驱动demo

三、远程调试

3.1 VS2019 远程调试

注:容易卡死,不稳定
1、VS2019中,选择 调试 - 附加到进程,连接类型选择 Windows Kernel Mode Debugger,连接目标为之前新建的Device,附加。
注意:附加前要开启虚拟机
2、Debug窗口会显示以下字样,表示已打开管道并等待重连。(注意是 Opened \.\pipe\com_1)
3、接着重新启动虚拟机,等待虚拟机进入桌面。Debug窗口显示如下:
注意:1.这里可能会花较长时间,并不是因为卡死了。
注意:2.重启虚拟机的时候记得禁用驱动程序强制签名。(或者使用testsigning)
4、进入桌面后,虚拟机可以正常操作。在VS2019中按下 全部中断
5、等待VS停下来,并出现以下画面,再点击 继续。(先暂停再继续,否则可能断不下来)。
注意:如果VS很长时间都没有响应,可以用任务管理器结束VS,然后重新打开再附加到进程。
6、此时就可以设置断点了
7、后面,同单机一样,用驱动加载工具安装驱动即可。

3.2 windbg远程调试

工具:windbg或win10商店的windbg preview(推荐)
1、Attach to kernel、配置com信息
2、重启虚拟机
3、配置符号文件路径
4、open source
5、下断点
  • break
  • 强制加载符号文件:.load /i KMDFDriver1.sys
  • 下断点:bp KMDFDriver1!DriverUnload
  • 继续运行:g
  • 在虚拟机加载驱动,触发相关过程,即可被断
注:
  • cpp源文件乱码:源码保存为utf8-bom模式
  • 断点位置不正确:确保pdb、cpp、sys文件编译版本一致
  • 断点时机:需要已经加载驱动,再下断点

四、QA

Q1: 编译时出现error MSB8040: 此项目需要缓解了 Spectre 漏洞的库
原因:这是因为Visual Studio默认开启了缓解Spectre攻击的机制,所以就有两种解决方案,一种是生成解决方案时禁用Spectre缓解机制,另一种就是安装Spectre缓解机制。
a) 禁用Spectre机制:  右键解决方案,然后选择“属性”,然后选择“配置属性”——“C/C++”——“代码生成”,在最下方有一项Spectre缓解,下拉选择“禁用“就行了
b) 安装Spectre缓解机制:如下:
  • 打开Visual Studio Installer,点击修改
  • 选择单个组件,选择Spectre缓解库(最新),其中“最新”对应的为你的MSVC编译版本。点击修改完成安装
Q2:error 1297: Device driver does not install on any devices, use primitive driver if this is intended.
参考:

版权声明:本文为longkuis原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。