https://blog.****.net/charlessimonyi/article/details/50904956
Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置
2016年03月16日 14:56:40
阅读数:11420
开发Windows驱动,我选择的环境是Win8.1+VS2013+WDK8.1+VirtualBox。理由如下:
①开发机器和测试机器均安装Win8.1,其中开发机器安装的是64位Win8.1,测试机器安装的是32位Win8.1。为什么装Win8.1?因为我平时电脑上装的就是Win8.1,Win10太新,WinXP太老。所以Win7和Win8.1是最合适的,当然以下环境配置,对于Win7和Win8.1来说,几乎都是一样的,你完全可以在Win7上按照本文进行配置。测试机器之所以安装32位系统,是因为64位系统只能装64位的驱动,要装32位的驱动,只能使用32位系统,刚开始学驱动开发,从32位驱动入手比较方便些,而且64位驱动需要签名才能安装,否则要让系统进入驱动测试模式,才能安装未签名的64位驱动,而32位的没有这个限制,未签名的驱动也能安装,搞起来更方便。
②为什么选择VisualStudio2013+WDK8.1?其实你可以选择VS2012+WDK8.0或VS2015+WDK10,其实它们配置下来都区别不大。不过因为我平时用的就是VS2013,索性就装了WDK8.1。需要注意的是WDK10可以开发Win10、Win8.1、Win8、Win7(以及对应的服务器版的操作系统)的驱动,WDK8.1可以开发Win8.1、Win8、Win7的驱动(不过实验证明大部分WDK8.1开发出来的针对Win8.1生成的驱动可以直接安装到Win10上),WDK7.1可以开发Win7、WinVista、WinXP的驱动。由于WinXP已经淘汰,且WDK7.1无法直接整合到VisualStudio上,故把它Pass掉。
③为什么选择VirtualBox,其实你可以选择VMware或真机,在配置上也没有多大的差异,因为WDK8.0以后的环境配置很简单,简单来说就是开发机和测试机都联网后,在测试机上安装一个EXE,在开发机的VisualStudio上输入它的计算机名、用户名、密码,然后就OK了。此后在VisualStudio中生成解决方案,它会自动帮你把驱动拷贝到虚拟机上并安装好。如果要单步调试,也只需配置一下调试串口就行了。所以用什么都一样,我之所以用VirtualBox是因为平时都用它,VirtualBox开源、免费,而且不像VMware那样搞一大堆启动项、服务、多个网卡,感觉很干净。
配置下来的驱动开发环境大致如下图(图盗自MSDN)
测试机器可以是虚拟机,也可以是真机。开发机器和测试机器通过两条线连接起来,其中一条是网线,有了网线连接,VisualStudio才能在你点击生成解决方案的时候,把驱动文件拷贝过去并安装好。但仅有网线,只能进行用户态程序的调试(用过VS远程调试功能的都知道),包括UMDF(用户模式驱动程序),而对于KMDF(内核模式驱动程序),无法仅通过网线来调试,为什么呢?因为内核模式下的驱动程序,在被调试,被中断时,整个操作系统都是暂停的,自然没有程序能继续执行并通过socket把调试数据发到开发机器上。所以为了调试内核模式驱动程序,还需要在开发机器和测试机器间连接起另一根线来,这根线可以是USB线、1394线或串口线。本文只讲串口线的方式,因为VirtualBox和VMware都支持虚拟串口,用起来很方便。如果测试机器是真机,则需要买条串口线来把它们连起来,淘宝有售,10块包邮哦!当然,如果测试机是虚拟机,不需要买网线和串口线,因为虚拟机已经提供了虚拟的线了。
如果要使用USB或1394可以参考MSDN文档:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh439376
步骤一:
先安装VisualStudio2013,再安装WDK8.1,这步没有什么悬念
步骤二:在虚拟机中装好32位的Win8.1系统。并在VirtualBox中配置一下网络,把网络连接方式改为“桥接网卡”,“界面名称”选择你的真机上能上网的那块网卡。
为什么要用“桥接网卡”方式来让虚拟机中的系统联网,而不用默认的“网络地址转换(NAT)”?因为如果使用“网络地址转换(NAT)”的话,对于虚拟机来说,你的真机相当于路由器,虚拟机相当于你的子局域网下的一台机器。也就是说你的真机和虚拟机并不在一个局域网中,你们在“网上邻居”中看不到彼此,那样的话你通过计算机名无法访问到虚拟机,那样搞起来会比较麻烦。所以使用“桥接网卡”方式。VMware中也有类似的设置。如果测试机器也是真机的话,只要开发机器和测试机器都连到同一个路由器上就没有问题了。
然后配置一下串口,如下图所示,启用串口,端口编号COM1,端口模式“主机管道”,路径/地址(即管道名字)设为“\\.\pipe\com_1”。
端口模式里面的其它模式是什么意思呢?简单来说:
“未连接”:效果就是对虚拟机来说,它的电脑主板上有串口,但是什么都没插。
“主机管道”:就是把虚拟机的串口映射到宿主机(我们的真机)的命名管道上,命名管道是Windows系统提供的一种进程间通信的方式,用过命名管道的程序员一定对上面这个“\\.\pipe\”很熟悉。
“主机设备”:就是把虚拟机的串口映射到宿主机的真实串口上,这时,我们真机的主板上的串口就不属于我们了,变成了虚拟机的私有财产去了,当我们在真机的窗口上插个设备上去后,实际上是插到了虚拟机里。
“裸文件”:貌似是把虚拟机的串口映射到一个宿主机中的一个文件句柄上?然后用ReadFile和WriteFile读写?没用过
“TCP”:把虚拟机的串口映射到宿主机的socket套接字上
当然这里只是科普一下,实际操作选“主机管道”并输入“\\.\pipe\com_1”就行了,其中的“com_1”是管道名,自己取的,你可以自己取一个不一样的。
VMware的设置如下,首先把虚拟打印机移除掉,因为它占用了COM1,当然你也可以不移除,那样调试串口就是用COM2,为了方便统一,好讲后面的步骤,统一使用COM1好了,果断移除虚拟打印机。
VMware的网络设置和串口设置直接看下图,不再赘述了。
步骤三:进入虚拟机中的系统,首先关闭UAC,然后为系统的Windows用户账户设置密码。因为待会儿要在VS中输入虚拟机的计算机名、用户名、密码进行连接,没有密码的话岂不是谁都可以连接你,那怎么行,不行。完成后重启一下虚拟机。
步骤四:在开发机的WDK安装目录下找到“WDK Test Target Setup”安装包,安装WDK8.1的时候如果是安装到默认路径,那么应该在“C:\Program Files (x86)\Windows Kits\8.1\Remote”文件夹下,有ARM、X64、X86版,由于我的测试机是32位系统,故选择X86文件夹下的“WDK Test Target Setup x86-x86_en-us.msi”,把这个安装包拷出来拿到虚拟机里进行安装。WDK10的路径可能有所不同,但只要在WDK安装目录下搜索“Remote”或“WDK Test Target”就能找到。
步骤五:在开发机器上打开VisualStudio,点击"DRIVER"-"Test"-"Configure Computers",如果VS没有"DRIVER"这个菜单项,说明WDK没有装好。
在弹出的"Computer Configuration"对话框中点击"Add New Computer",然后在"Computer name"中输入虚拟机的计算机名,下面的选项第一项“Provison computer and automatically configure debugers”是全自动,方便是方便,不过它不会自动设置调试串口。所以选择第二项“Provision computer and choose debuger settings”。
点击下一步,照着下图进行设置,连接方式"串口",波特率默认115200,勾选管道,勾选自动重连,管道名"\\.\pipe\com_1",然后点击下一步。
如果连接成功的话会要求你输入虚拟机的用户名和密码。如果出现连接失败,请检查你的真机和虚拟机能否相互ping同,你在网络邻居(网络)中能否看到彼此的计算机名。
用户名和密码输入正确后,他们两边就开始噼里啪啦一顿乱搞了,期间虚拟机还会注销、重启、打开应用商店、自动安装一堆东西,总之你要做的事情就是冲一杯咖啡,烤一根热狗,边享受边等待美好世界的来临。
几分钟后,随着进度条滚到底以及"Complete"字样的出现,世界就晴朗了。点击一下"下一步"和"完成",从此开启我们的*和谐生活。
步骤六:新建一个驱动项目,比如新建一个KMDF项目
VS为我们生成的解决方案中有两个项目,其中KMDF Driver用于生成驱动程序文件,KMDF Driver Package用于部署安装测试驱动。打开KMDF Driver Package项目的属性对话框,找到"配置属性"-"Driver Install"-"Deployment",在此选项卡上,勾选"Enable deployment","Target Computer Name"就选择刚才配置好的虚拟机的机器名。"Driver Installation Options"选择"Hardware ID Driver Update",然后输入ID,ID输什么呢,可以在KMDF Driver项目中的inf文件里找,inf文件里的[Standard.NT]节中有ID,照着填入即可,然后点确定。
完成了上面的步骤以后,每次你点击生成解决方案,它会自动把生成好的驱动程序传到虚拟机中并自动安装好,下图就是虚拟机中已经装好的可爱的虚拟设备。
接下来如果你直接点调试运行,会发现驱动自动装好了,也进入调试中了,可以手动点“全部中断(暂停调试)",但是代码中的断点断不下来!这里还要注意一点,当你点击调试运行后,紧接着马上就点“全部中断(暂停调试)”,然后再点继续调试,不出意外的话就能命中断点了。至于为什么?这个问题太深奥,天机暂时还没泄露,等天机泄露给我了,我再来更新文章说明。
下面就是激动人心的DriverEntry中的断点命中图,注意右下角的“Debugger Immediate Window”实际上就是嵌入到VisualStudio中的WinDbg,用法是一样的哦。
还不清楚的直接上MSDN看视频教程:
与本文相关的3个视频:
还有更多高级、好用、方便的功能。具体参照MSDN上的文档来,驱动开发资料入口:https://msdn.microsoft.com/zh-cn/windows/hardwa