整体开发环境

  1. win10 开发机
  2. vmware 上的 win10 调试机

开发机环境

  1. windows sdk: 版本 10.0.16299.0
  2. wdk 版本10.0.16299.15
  3. vs2017
  4. vmware 16.2

创建项目并编译

使用vs2017创建编译NT式驱动
  1. 使用vs2017不能直接创建nt式驱动的项目,我们这里创建一个空的wdm项目,如图:
  2. 在项目属性中选择windows sdk的版本为10.0.16299.0,如图:
  3. 关闭一些特殊的编译开关,如图:
  4. 编译后,会生成如下几个对象:

win10上测试NT式驱动

  1. 执行下面的命令, 使电脑进入测试模式,并重启电脑:
  • bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
  • bcdedit /set testsigning on
  1. 安装测试证书,即WDK_PRO_NT_HelloDDK.cer,否则无法加载驱动.如图:
  2. win镜像里的驱动 win10镜像驱动_蓝屏

  3. 使用DriverMonitor加载驱动,如图:
  4. win镜像里的驱动 win10镜像驱动_蓝屏_02

  5. 点击,卸载驱动,虚拟机蓝屏,如图:
    .
  6. win镜像里的驱动 win10镜像驱动_windows_03

定位电脑蓝屏的原因

  1. 修改配置,以便在电脑蓝屏的时候生成dump
  2. win镜像里的驱动 win10镜像驱动_win镜像里的驱动_04

  3. dump文件在C:\Windows\MinidumpC:\Windows下:
  4. win镜像里的驱动 win10镜像驱动_分页_05

  5. 用windbg打开dump文件
  6. win镜像里的驱动 win10镜像驱动_windows_06

  7. 第一步: 在windbg中选择驱动对应的ImagePath;
    第二步: 设置微软的符号路径和驱动符号路径, 必须要设置微软的符号路;
    第三步: 执行reload /f. 第一次调试时,必须要加载,后面就不需要了;
    第四步: !analyze -v

一个常见的蓝屏case

  1. 从dump中看,还没有进去DriverEntry,在__security_init_cookie时出了问题:
  2. 原因是生成驱动时,选择的目标平台是win10,但是驱动运行在win7上,解决方法如下:
    将目标平台设置为win7。
驱动重复加载导致下面的错误

win镜像里的驱动 win10镜像驱动_win镜像里的驱动_07

内存指定错误导致蓝屏

  • 创建符号链接的代码再#pragma INITCODE中,卸载驱动的时候删除符号链接时,找不到对应的内存导致蓝屏:

win7下有些电脑的debugviewer无法显示

解决办法: 修改注册表
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
“Debug Print Filter”=dword:00000008

第二部分 双机调试

  • 虚拟机上安装wdk,wdk的版本和宿主机wdk的版本需要保持一致
  • 虚拟机上安装安装驱动调试程序,路径在C:\Program Files (x86)\Windows Kits\10\Remote\x64
  • 保证宿主机和虚拟机之前网络通畅,互相使用设备名称ping对方ping WIN-GBHF5EDVGGD如果ping不通,则需要关闭双方的防火墙。
  • 删除虚拟机上的打印机,避免多余的串口干扰
  • 给虚拟机新增一个串口
  • 将虚拟机设为debug模式
  • 先运行msconfig
  • 重启电脑
  • visual studio 做如下配置

分页内存

  • 默认情况下,常量字符串,临时变量都是非分页内存,代码也是非分页内存,可以使用#pragma code_seg("PAGE")将数据和代码放到分页内存中。
  • 通常在text段中的都是非分页内存,可以通过ida来证明这一点
  • .text段的flags&0x08000000=1
  • .idata段的flags&0x08000000=1,所以它也会被加载到非分页内存中

win镜像里的驱动 win10镜像驱动_win镜像里的驱动_08

  • #pragma code_seg("PAGE")只能传PAGE,编译后能看到一个PAGE段,这个应该是编译器和系统之间默认约定的
  • 只有PAGE段flags&0x08000000=0,所以他是被加载到分页内存中的

win镜像里的驱动 win10镜像驱动_分页_09