windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调

【我的】vs2013+WDK8.1+winDbg+vmwarewin7虚拟机联调
作者:zcr214 时间:2016/4/8

内核驱动开发,首先要配置开发环境,目前微软已经出到了vs2015+WDK10,按照国内的这个形势,官方机构或大型企业应该是积极参与“去IOE”战略的,加上现在政府机关禁止使用win8以上的windows系统,所以目前来看主流的仍然是win7,并且中国国内还会有相当长的一段时间主导系统会是win7。于是内核驱动开发也重点放在win7吧。
原料选择:visual studio 2013。
WDK8.1。 不选WDK7的原因是8.1更方便,不选WDK10的原因是10比较新不知道兼容或者一些库是否有改变。在官网下载即可https://msdn.microsoft.com/zh-cn/windows/hardware/hh852365.aspx
WinDbg。在visual studio2013中已经集成了,不用单独安装。
Windows symbol files。Windows调试符号程序包,在调试中会用到,在官网下载https://msdn.microsoft.com/zh-cn/windows/hardware/gg463028,选择window7对应版本即可。
虚拟机平台:vmware11 workstation。
虚拟机系统:win7专业版 32bit。
其他可选工具:SRVINSTW,用于安装写好的.sys文件
Dbgview,用于查看系统输出信息,当然可以看内核输出信息。
实体主机:win7 旗舰版 64bit

步骤详解:
一、安装需要的原料 1.下载,安装visualstudio 2013 ,使用镜像文件安装即可。关于主题默认白色可以手动换为深色,编辑器字体是sourcecode pro semibold,配色等可以去http://studiostyl.es/下载,我这里用的是Son of Obsidian
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



【windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调】2.去微软官网下载WDK8.1,安装只能在c盘(强迫症不能忍啊!)
3.下载windows符号程序包,安装后配置一下环境变量:分别是_NT_NT_SYMBOL_PATH和_NT_ALT_SYMBOL_PATH,两个都写符号程序包的安装目录即可。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



4.安装虚拟机平台vmware11,其他版本也行
5.装虚拟机系统,win7专业版32bit,其他版本其实也无所谓,最好32bit。
6.网上搜索SRVINSTW和Dbgview软件,放到虚拟机系统里备用。
二、visual studio2013配置 1、当WDK8.1安装好以后,在vs2013中选文件→新建→项目,会看到有windows Driver这个类别了,新建一个空的驱动项目Empty WDM Driver,命名为MyDriver。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



首先会有两个工程,一个就是驱动工程,另外一个是package工程(这个是测试驱动安装的一个工程,对于我们来说其实用处不大,这里只是做调试的测试,所以可以直接删除)。驱动工程中还会帮你建立一个inf文件,NT式驱动是使用不到的(当然新一代的过滤驱动,例如 minifilter 是使用的,VS2013支持直接创建minifilter工程),这里只是调试的测试使用,所以可以删除掉。我们直接添加一个Driver.c(因为微软内核使用的也是C,而且C是能够直接操作内存,所以开发用C语言比较合适)添加一些简单的代码,如下:
#include
voidDriverUnload(PDRIVER_OBJECTpDriveObject)
{
UNREFERENCED_PARAMETER(pDriveObject);
DbgPrint("hello ,Enter Driveload \n");
}

NTSTATUSDriverEntry(PDRIVER_OBJECTpDriverObject,PUNICODE_STRINGpRegPath)
{
NTSTATUSstatus=STATUS_SUCCESS;
UNREFERENCED_PARAMETER(pRegPath);
DbgPrint("hello world!Enter DriverEntry \n");
pDriverObject->DriverUnload=DriverUnload;
returnstatus;
}
2、接下来生成一下,如果有报错,可能是一些警告之类的,尽量修复这些错误,也可以将安全告警等级降低一下。选中项目,右键→属性→C/C++常规→警告等级,设置为等级3;链接器→将链接器警告视为错误→否。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片

windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片




然后重新生成一下,应该就成功了。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



3、调试必须在另一台机器上,可以是远程主机也可以是虚拟机,这里当然是虚拟机,所以需要设置一下目标机器。选择DRIVER→Test→ConfigureComputer
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



添加一个新的计算机,填写名称,选择手动设置即Manually configure
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片

windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



选择连接类型为serial串口的方式,波特率默认115200不变,勾选pipe,reconnect,设置pipe名称,完成。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



调试器选择win7 debug 和win32
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片

三、虚拟机串行端口配置 给虚拟机配置一个串行端口,如果默认的有打印机占用了串行端口,可以先删除掉打印机,再添加。选择使用命名的管道,名称与vs2013中配置的一致,该端是服务器,另一端是应用程序。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片


四、虚拟机Win7 系统配置 在 vista 及后续的 windows 已经取消了 ntldr 模块管理引导,转而以bootmgr 模块管理引导系统。在我的 windows 7中要设定在哪个部分进行调试。windws 7 可调试部分有 4 个:bootmgr 模块、winload 模块、WinResume 模块以及 windows 内核模块 Nt 模块,可以在上述的 4 个模块下断点进行调式:
1、设置bootmgr模块。以管理员身份运行“命令提示符”,输入以下命令:

bcdedit /set {bootmgr} bootdebug on
bcdedit /set {bootmgr} debugtype serial
bcdedit /set {bootmgr} debugport 1
bcdedit /set {bootmgr} baudrate 115200

注意一个细节,bcdedit /set {bootmgr}debugport 1这一行最后的1 对应Serial Port 1,
所以如果是Serial Port 2 则设置为bcdedit /set {bootmgr} debugport 2 否则连不上。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



2、设置winload模块。winload 的 GUID 为 current,所以输入命令:
bcdedit /set {current} bootdebug on
bcdedit /set {current} debugtype serial
bcdedit /set {current} debugport 1
bcdedit /set {current} baudrate 115200
然后输入bcdedit /enum命令可以查看到刚刚的设置情况
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



3、设置NT模块。Win+R运行,输入msconfig,设置引导→高级选项→调试,设置好调试端口com1和波特率115200默认不变。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



重启win7虚拟机,以上设置就生效了。
五、Windbg内核调试 1、安装驱动。之前编译生成好的项目中,找到.sys文件,我这里的路径如图。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



将其拷贝到win7虚拟机里。
2、驱动文件.sys并不能直接双击安装,所以打开SRVINSTW软件,点安装服务,命名。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



在输入路径时,只能手动输入,如果按浏览只能找到.exe的文件,不能识别.sys,所以手敲吧。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



一路按向导安装完成即可,注意在选择启动类型要选手动,这样方便后面调试可以手动启动和关闭。
3、测试一下,驱动是否正常可用,打开Dbgview,在capture里全部勾选上。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



然后打开命令提示符,输入net start my ,这里my是刚才安装驱动时取的名称,结束则输入net stop my。就可以看到内核中的输出信息了。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



4、驱动没问题,现在在vs2013中点F5运行,选择之前设置的计算机,调试器就跑起来了,可以看到WinDbg中正在等待连接,接着在源代码上打一些断点,。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



重新启动虚拟机系统,就连接上了。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片


此时win7时黑屏状态,它正等待 serial port 的响应,在vs2013中,全部中断,于是win7虚拟机就被断下来了,可以看到int 3。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



再在WinDbg窗口中输入g,继续运行。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片



正常开机以后,在win7虚拟机中,启动驱动:net start my,如果以上配置无误,则win7系统会立刻被断下来。
5、单步调试,F10或F11,可以看到编辑器中代码跟踪,WinDbg输出信息,寄存器信息,运行正常。
windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片

windows内核驱动开发|【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调
文章图片





至此,vs2013+WDK8.1+winDbg+vmware win7虚拟机联调配置成功。

    推荐阅读