整体开发环境
- win10 开发机
- vmware 上的 win10 调试机
开发机环境
- windows sdk: 版本 10.0.16299.0
- wdk 版本10.0.16299.15
- vs2017
- vmware 16.2
创建项目并编译
使用vs2017创建编译NT式驱动
- 使用vs2017不能直接创建nt式驱动的项目,我们这里创建一个空的wdm项目,如图:
- 在项目属性中选择windows sdk的版本为10.0.16299.0,如图:
- 关闭一些特殊的编译开关,如图:
- 编译后,会生成如下几个对象:
win10上测试NT式驱动
- 执行下面的命令, 使电脑进入测试模式,并重启电脑:
bcdedit /set loadoptions DDISABLE_INTEGRITY_CHECKS
bcdedit /set testsigning on
- 安装测试证书,即
WDK_PRO_NT_HelloDDK.cer
,否则无法加载驱动.如图: - 使用DriverMonitor加载驱动,如图:
- 点击,卸载驱动,虚拟机蓝屏,如图:
.
定位电脑蓝屏的原因
- 修改配置,以便在电脑蓝屏的时候生成dump
- dump文件在
C:\Windows\Minidump
或C:\Windows
下: - 用windbg打开dump文件
- 第一步: 在windbg中选择驱动对应的ImagePath;
第二步: 设置微软的符号路径和驱动符号路径, 必须要设置微软的符号路;
第三步: 执行reload /f. 第一次调试时,必须要加载,后面就不需要了;
第四步: !analyze -v
一个常见的蓝屏case
- 从dump中看,还没有进去DriverEntry,在__security_init_cookie时出了问题:
- 原因是生成驱动时,选择的目标平台是win10,但是驱动运行在win7上,解决方法如下:
将目标平台设置为win7。
驱动重复加载导致下面的错误
内存指定错误导致蓝屏
- 创建符号链接的代码再#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,所以它也会被加载到非分页内存中
-
#pragma code_seg("PAGE")
只能传PAGE,编译后能看到一个PAGE段,这个应该是编译器和系统之间默认约定的 - 只有PAGE段flags&0x08000000=0,所以他是被加载到分页内存中的