原文链接 Windows驱动开发:环境搭建(1)
目前最新的WDK版本为WDK10,最新的IDE为VS2017,但目前的VS2017并不支持驱动开发,根据MS的路线图,新的开发工具还在研发中,所以目前还是用VS2015 Update3 + SDK + WDK10。
学习一门开发技术,首先是搭建环境,这样我们才能直观地感受这门技术,这远比书本上看来的直观。下面,依照目前当前的实际情况,说一下驱动开发环境。
Windows平台
Windows平台以Vista、Windows 7 为分水岭。自Vista开始有了UAC,所以一般的应用开发就Vista为界限;对WDK10来说,因为WDK10支持的最早版本就是Windows7,所以对目前我们进行驱动开发来说,就以Windows 7 位界限。
目前还能支持XP的DDK版本是DDK 7.1,这是最后一个支持XP的版本。
我们开发驱动,肯定至少要支持XP – win10,这也是几乎所有驱动厂商都要支持的。根据我们上面所说,那么我们就需要以下几种组合:
WDK10 —— 针对Windows 7 到 Windows 10的版本
DDK7.1 ——针对的是XP及以后版本
直接看,我们用DDK7.1开发就可以了,但针对新平台的许多特性,DDK7.1并不具备,因此目前阶段我们要搭建以下几种开发、测试环境:
- VS2015 + WDK10 + 虚拟机WIN10 (32+64) : 组合一
- VS2015 + WDK10 + 虚拟机WIN7(32+64) : 组合二
- VS2015 + WDK10 + 虚拟机XP : 组合三
- VS2015 + DDK7.1 + 虚拟机WIN10(32+64) : 组合四
- VS2015 + DDK7.1 + 虚拟机WIN7(32+64) : 组合五
- VS2015 + DDK7.1 + 虚拟机XP : 组合六
如果有些环境无法用VS2015直接调试,那么可以考虑用windbg调试。
环境搭建
组合一:
1.创建一个Windows 10 Enterprise版本,因为我本机也是装了这个版本,要与虚拟机一致;
2.增加一个串口,一般我是删除掉打印机占用的COM1,让新增加的串口号为1;
3.对虚拟机进行设置
设置虚拟机系统为内核可调试状态:
bcdedit /set {default} DEBUG YES
bcdedit /set TESTSIGNING ON
设置虚拟机串口调试
bcdedit /debug on
bcdedit /dbgsettings serial debugport:1 baudrate:115200
在WDK10安装目录下(我的是C:\Program files(x86)\windows kits\10)找到文件WDK Test Target Setup x86-x86_en-us.msi和WDK Test Target Setup x64-x64_en-us.msi,拷贝到虚拟机中进行安装。
4.对VS2015进行设置
走到这,发现Network Hostname没有让我们输入的地方啊,还有一个红框把Provisioning Options框起来,是有什么特别的意图吗?到了这部,在网上搜了半天都没搜出来,所以重装了两次VS+WDK,还是没法解决,后面也忘了怎么想着就拉伸了一下,结果你猜怎么着?就下面这副鸟样了
我只能说,MS你家真不厚道啊,你家产品经理有脑子吗?
言归正传,继续往下走,这里Provisioning Options有两个选项:
Provision device and choose debugger settings和Manually configure debuggers and do not provision,前者是在target machine安装和配置组件,以允许从VS直接分发驱动,运行测试。默认的debug设置也会被设置到目标机器上。相比较,后者就是在VS里设置debugger settings,而target machine上的设置需要我们像第三步那样手动设置。
如果我们选择了前者,那么其实第三步可以省略,这时候target machine上会创建一个新的用户WDKRemoteDebugger,我们的调试,会在这个用户下进行。
好了,配置已经做完了,下面就是正式调试。
在组合一里面,其实也有三种情形。
(1)WDM驱动调试
(2).KMDF驱动调试
(3).UMDF驱动调试
因为目前正在看《Windows内核安全与驱动开发》,开头就是WDM驱动的例子,所以此处我们暂且放下,但后面一定会讲到,而且注意,KMDF和UMDF的调试也还是有很多小技巧以及注意的地方。
WDM驱动是以服务的方式运行,因此,我们需要有一个驱动加载工具,这方面的工具很多,有InstSrv,DriverStudio,还有书上推荐的srvinstw,但很不幸好像都不支持64位驱动加载,所以最后我们还要找一个64位WDM驱动加载工具,实在不行,只能自己写一个了。
VS在Debug->Attach to Process下
直接附加到Kernel进程里,待系统启动后,我们break一下,设置断点,然后再continue,这样断点就能生效了(其实不break,断点也能生效,但有时候就不能生效,是挺奇怪的,我说的不能生效是在调试KMDF的时候)。
把生成的驱动拷贝到target machine,我用的是InstSrv加载工具,先安装驱动,再启动,点击启动的时候,就进入到VS中的DriverEntry中的断点了。注意:不需要拷贝符号表文件,本身就是VS加载调试,我不理解为什么有的文章里写一定要把PDB文件一块拷贝进去。
组合二:
这个组合可把我坑苦了。。。重装了N遍虚拟机,实在找不出原因了,我还装了英文版,英文版不行,我还更新了700多M的补丁,到头来我也不知道自己哪儿错了,只知道一条路不通,另外一条路可以,在搜索引擎里找了好久,终于找到一个靠谱的blog,其它的都不靠谱,按理说搞驱动开发的不少啊,可能写blog的少吧。
1和2,装虚拟机和增加串口就不说了,跟上面一样;
3.以管理员身份,在虚拟机cmd下运行
bcdedit /debug on