【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内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第1张图片

2.       去微软官网下载WDK8.1,安装只能在c盘(强迫症不能忍啊!)

3.       下载windows符号程序包,安装后配置一下环境变量:分别是_NT_NT_SYMBOL_PATH_NT_ALT_SYMBOL_PATH,两个都写符号程序包的安装目录即可。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第2张图片

4.       安装虚拟机平台vmware11,其他版本也行

5.       装虚拟机系统,win7专业版32bit,其他版本其实也无所谓,最好32bit。

6.       网上搜索SRVINSTW和Dbgview软件,放到虚拟机系统里备用。

二、visual studio2013配置

1、当WDK8.1安装好以后,在vs2013中选文件→新建→项目,会看到有windows Driver这个类别了,新建一个空的驱动项目Empty WDM Driver,命名为MyDriver。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第3张图片

首先会有两个工程,一个就是驱动工程,另外一个是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内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第4张图片

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第5张图片

然后重新生成一下,应该就成功了。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第6张图片

3、调试必须在另一台机器上,可以是远程主机也可以是虚拟机,这里当然是虚拟机,所以需要设置一下目标机器。选择DRIVER→Test→ConfigureComputer

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第7张图片

添加一个新的计算机,填写名称,选择手动设置即Manually configure

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第8张图片

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第9张图片

选择连接类型为serial串口的方式,波特率默认115200不变,勾选pipe,reconnect,设置pipe名称,完成。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第10张图片

调试器选择win7 debug 和win32

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第11张图片

三、虚拟机串行端口配置

给虚拟机配置一个串行端口,如果默认的有打印机占用了串行端口,可以先删除掉打印机,再添加。选择使用命名的管道,名称与vs2013中配置的一致,该端是服务器,另一端是应用程序

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第12张图片

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第13张图片

四、虚拟机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内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第14张图片

 

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内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第15张图片

3、设置NT模块。Win+R运行,输入msconfig,设置引导→高级选项→调试,设置好调试端口com1和波特率115200默认不变。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第16张图片

重启win7虚拟机,以上设置就生效了。

五、Windbg内核调试

1、安装驱动。之前编译生成好的项目中,找到.sys文件,我这里的路径如图。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第17张图片

将其拷贝到win7虚拟机里。

2、驱动文件.sys并不能直接双击安装,所以打开SRVINSTW软件,点安装服务,命名。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第18张图片

输入路径时,只能手动输入,如果按浏览只能找到.exe的文件,不能识别.sys,所以手敲吧。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第19张图片

一路按向导安装完成即可,注意在选择启动类型要选手动,这样方便后面调试可以手动启动和关闭。

3、测试一下,驱动是否正常可用,打开Dbgview,在capture里全部勾选上。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第20张图片

然后打开命令提示符,输入net start my ,这里my是刚才安装驱动时取的名称,结束则输入net stop my。就可以看到内核中的输出信息了。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第21张图片

4、驱动没问题,现在在vs2013中点F5运行,选择之前设置的计算机,调试器就跑起来了,可以看到WinDbg中正在等待连接,接着在源代码上打一些断点,。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第22张图片

重新启动虚拟机系统,就连接上了。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第23张图片

此时win7时黑屏状态,它正等待 serial port 的响应,在vs2013中,全部中断,于是win7虚拟机就被断下来了,可以看到int 3。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第24张图片

再在WinDbg窗口中输入g,继续运行。


 

正常开机以后,在win7虚拟机中,启动驱动:net start my,如果以上配置无误,则win7系统会立刻被断下来。

5、单步调试,F10或F11,可以看到编辑器中代码跟踪,WinDbg输出信息,寄存器信息,运行正常。

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第25张图片

【windows内核编程】vs2013+WDK8.1+winDbg+vmware win7虚拟机联调_第26张图片

 

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

你可能感兴趣的:(windows内核驱动开发,windows,win7,visual,studio,WDK,内核)