WIN10+VS2017+WDK10+SDK10+VM虚拟机驱动开发调试环境搭建!采坑

1、准备工做

1  系统环境:Win10系统

2  开发工具:VS2015

3  驱动开发工具:WDK10

4  Windows SDKSDK10(安装的时候必须所有勾选安装,不然编译会出现缺乏waring.h等头文件之类的错误)

5  VM虚拟机:VMware WorkStation 12

 

Win十、WDK十、SDK10的版本必须一致个人用的都是15063版本。有些人弄不清win10版本对应关系,又是1506三、又是170三、还有叫RS2的。其实这3个都是指同一个win10的版本。具体对应关系见维基百科,很是详细!Win10版本对应关系(维基可能被墙给个截图吧)git

 

win10 64位下驱动安装工具下载地址(此工具只在上述环境下测试过,请在虚拟机中测试过再在真实环境下安装不然蓝屏本身负责)github

http://download.csdn.net/detail/qing666888/9468506windows

注意事项:安全

关闭 、主机 客户机 防火墙 、 互相ping都能ping通。函数

 

2、具体操做步骤

工具安装就不说了,不会的百度一下。只说一下一些关键的地方。工具

一、安装好虚拟机后,给虚拟机增长一个串口设备。具体操做见图:开发工具

上面的\\.\pipe\com_1能够改\\.\pipe\com_2,我就不改了后面名字能够随便取的,完成配置后虚拟机设备配置就多了一个串行端口的设备。由于打印机用了端口1。因此设备里面显示的是串行端口2,从新启动虚拟机系统后,会发现设备管理里面多了一个COM2的串口设备(若是想设置成端口1,把打印机设备删了在添加串口设备)。测试

 

二、配置虚拟机系统为调试模式this

    以管理员身份,在虚拟机命令行模式下运行以下2个命令开启。spa

    bcdedit /debug on
    bcdedit /dbgsettings serial debugport:n baudrate:115200
    where n is the number of a COM port on the virtual machine.
  (n时虚拟机的一个COM端口号。就是设备显示的串行端口2,n就是端口2)。

    咱们使用下面的语句便可:

    bcdedit /debug on

    bcdedit /dbgsettings serial debugport:2 baudrate:115200

 

三、把WDK10的虚拟机调试驱动拷贝到虚拟机中安装。

由于VS2015能够调试x86 x64两种驱动,根据被调试系统选择不一样的文件拷贝到虚拟机安装,个人是64位的选择x64

 

四、VS2015开发工具配置

在VS2015的菜单栏点击DRIVER--TEST--CONFIGURE DEVICES,选择增长新设备,以下图:

或者换个地方配置,从工程属性里面进行配置。右键工程属性配置从这也能够进行测试设备的配置:

配置界面,下面两个选项第一项由VS2015帮咱们建立一个WDKuser测试帐户,自动打开测试模式等。第二个是使用咱们本身配置的参数。因为上面咱们已经配置了串口参数 、设置了调试模式因此咱们选择第二个就好了。

以下配置在内核模式中,选择串口、配置好波特率、勾上2个选项、管道名称、端口号(咱们上面配置的COM2)。

出现上述红色框字样则说明配置已经成功了。(不要开启全局代理软件,不然会出现链接不上的问题)。

 

五、使用工具安装调试64位驱动

网上下的下面的驱动安装软件貌似64位的都用不了。

本身动手丰衣足食大笑,本身在网上弄了个源码改了下弄成能够加载64位的驱动的版本了。

1)使用DebugView打印内核调试信息是开发驱动的很是重要的手段,但DebugView默认在WINDOWS 10下却没法获取内核的调试日志,驱动调用KdPint/DbgPrint等的打印结果是没法被DebugView给捕捉到的。设置方法以下(复制下面的代码到txt文件。改后缀为.reg后执行(看清楚了是.reg不是.bat敲打),而后重启电脑):

 
  1. Windows Registry Editor Version 5.00

  2.  
  3. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]

  4. "DEFAULT"=dword:0000000f

2)还有本身编译出来的驱动要使用编译的Debug版原本测试,使用KdPrint打印须要显示的调试信息。下面是在Win10 64位的虚拟机中用此安装程序,加载64位的驱动以及用DebugView查看驱动打印消息的截图结果。DebugView中须要勾选Capture Kernel选项。

 

六、在VS2015中下断点进行调试

若是你第五部已经完成了,而且在DebugView中已经可以输出调试的打印信息了,辣么骚年你已经离成功只有一部之遥了大笑

建立一个驱动工程,WDK10提供的模板中根本没有提供NT驱动模板,咱们如何建立NT驱动呢?
解决:其实虽然没有提供NT模板,可是咱们能够创建WDM空模板工程,而后再本身添加文件,编译,获得的也就是NT驱动了。

驱动工程中会帮你创建一个inf文件,NT是使用不到的,能够直接删除。咱们直接添加一个MyDriver.c,后缀必须是.c。若是后缀是.cpp,编译会报错:没法解析的外部符号 _DriverEntry@8,该符号在函数 _GsDriverEntry@8 中被引用  。

在文件中添加测试代码。

 
  1. #include <ntifs.h>

  2.  
  3. VOID DriverUnload(PDRIVER_OBJECT objDriver)

  4. {

  5. // 避免编译器关于未引用参数的警告

  6. UNREFERENCED_PARAMETER(objDriver);

  7.  
  8. // 什么也不作,只打印一行字符串

  9. KdPrint(("My Dirver is Ending..."));

  10. }

  11.  
  12. NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)

  13. {

  14. // 避免编译器关于未引用参数的警告

  15. UNREFERENCED_PARAMETER(strRegPath);

  16.  
  17. // 打印一行字符串,并注册驱动卸载函数,以便于驱动卸载

  18. KdPrint(("My Dirver Is Starting!\r\n"));

  19.  
  20. objDriver->DriverUnload = DriverUnload;

  21.  
  22. return STATUS_SUCCESS;

  23. }

编译,报错,没有关系,这些都是由于安全警告等级过高了,咱们能够下降编译器警告等级的方式解决:

执行编译,编译的时候选择Debug模式,选择X64的选项(由于咱们的虚拟机使用的是64位的系统,不可以运行x86的驱动,若是你编译出来的是x86的驱动,用上的工具安装是能够,可是启动失败提示阻止运行之类的)。编译成功后,按照上面的第五步进行安装测试。

不知不觉感受已经写了好长了。。。。奋斗抽口烟压压精。好吧我不抽烟的。。。。。继续。若是上述的驱动成功编译出来了。辣么如今咱们开始附加虚拟机的内核进行调试了。

首先把虚拟机的系统内核附加到VS2015,具体步骤见下图:

选中内核调试模式、选本身配置的那个电脑、选中下面列表中内核。见下图

点击附加,而后出现下图界面,点击一下所有中断。

而后系统就断下了,虚拟机的系统咱们鼠标已经点不了,如今系统处于挂起状态了。见下图

如今咱们能够到源代码中下断点了。我就随便下个断点了,见图:

而后咱们在下面的Debugger Immediate Winddow窗口的 Kd>  一行输入命令 g 让系统运行起来。这样虚拟机中的系统又能够点击了。

 

最后一步了。使用咱们刚刚创建的驱动工程编译出来的.sys驱动文件拷贝到虚拟机中。用第五步的工具进行安装、启动。启动的时候自动触发VS2015中的下的断点。至此能够像平时咱们调试程序同样进行单步调试了。

注意事项:一、必定要拷贝Debug版本的进行调试。

                  二、拷贝到虚拟机中的.sys文件必定要是你源码编译出来的。

                  三、若是改动了源码后必定要从新拷贝一份新的驱动文件到虚拟机中调试,不然没法触发断点的。

 

3、关于驱动签名

增长一点关于驱动签名的吧,有不少小伙伴编译成功后,驱动安装的时候一直弹出下面的这个图片,驱动没有签名被系统阻止安装,解决方案百度上面说的基本是每次开机都进入启动设置中----禁用驱动签名强制、bcdedit  nointegritychecks on 或者 loadoptions DDISABLE_INTEGRITY_CHECKS等。这些方法都是之前的方法基本都没什么用了。

下面提供两个可用方法:

1)使用过时签名(下载个过时签名给驱动签上,把系统时间改到签名有效期内)。签名有版权问题东西就不提供了,本身到看雪能搜到。

2)使用UPGDSED(能够同时关闭PathGuard跟驱动强制签名)使用说明见下:

下载地址:https://github.com/hfiref0x/UPGDSED

管理员权限运行patch.exe,按照提示输入大写的CONTINUE按回车确认,patch完成后输入Enter退出,重启系统用另一个启动项启动系统。本人在windows10 企业版(15063)测试成功,能够不开启测试签名模式下加载64位驱动。

4、采坑

      

1、准备工做

1  系统环境:Win10系统

2  开发工具:VS2015

3  驱动开发工具:WDK10

4  Windows SDKSDK10(安装的时候必须所有勾选安装,不然编译会出现缺乏waring.h等头文件之类的错误)

5  VM虚拟机:VMware WorkStation 12

 

Win十、WDK十、SDK10的版本必须一致个人用的都是15063版本。有些人弄不清win10版本对应关系,又是1506三、又是170三、还有叫RS2的。其实这3个都是指同一个win10的版本。具体对应关系见维基百科,很是详细!Win10版本对应关系(维基可能被墙给个截图吧)

 

win10 64位下驱动安装工具下载地址(此工具只在上述环境下测试过,请在虚拟机中测试过再在真实环境下安装不然蓝屏本身负责)

http://download.csdn.net/detail/qing666888/9468506

注意事项:

关闭 、主机 客户机 防火墙 、 互相ping都能ping通。

 

2、具体操做步骤

工具安装就不说了,不会的百度一下。只说一下一些关键的地方。

一、安装好虚拟机后,给虚拟机增长一个串口设备。具体操做见图:

上面的\\.\pipe\com_1能够改\\.\pipe\com_2,我就不改了后面名字能够随便取的,完成配置后虚拟机设备配置就多了一个串行端口的设备。由于打印机用了端口1。因此设备里面显示的是串行端口2,从新启动虚拟机系统后,会发现设备管理里面多了一个COM2的串口设备(若是想设置成端口1,把打印机设备删了在添加串口设备)。

 

二、配置虚拟机系统为调试模式

    以管理员身份,在虚拟机命令行模式下运行以下2个命令开启。

    bcdedit /debug on
    bcdedit /dbgsettings serial debugport:n baudrate:115200
    where n is the number of a COM port on the virtual machine.
  (n时虚拟机的一个COM端口号。就是设备显示的串行端口2,n就是端口2)。

    咱们使用下面的语句便可:

    bcdedit /debug on

    bcdedit /dbgsettings serial debugport:2 baudrate:115200

 

三、把WDK10的虚拟机调试驱动拷贝到虚拟机中安装。

由于VS2015能够调试x86 x64两种驱动,根据被调试系统选择不一样的文件拷贝到虚拟机安装,个人是64位的选择x64

 

四、VS2015开发工具配置

在VS2015的菜单栏点击DRIVER--TEST--CONFIGURE DEVICES,选择增长新设备,以下图:

或者换个地方配置,从工程属性里面进行配置。右键工程属性配置从这也能够进行测试设备的配置:

配置界面,下面两个选项第一项由VS2015帮咱们建立一个WDKuser测试帐户,自动打开测试模式等。第二个是使用咱们本身配置的参数。因为上面咱们已经配置了串口参数 、设置了调试模式因此咱们选择第二个就好了。

以下配置在内核模式中,选择串口、配置好波特率、勾上2个选项、管道名称、端口号(咱们上面配置的COM2)。

出现上述红色框字样则说明配置已经成功了。(不要开启全局代理软件,不然会出现链接不上的问题)。

 

五、使用工具安装调试64位驱动

网上下的下面的驱动安装软件貌似64位的都用不了。

本身动手丰衣足食大笑,本身在网上弄了个源码改了下弄成能够加载64位的驱动的版本了。

1)使用DebugView打印内核调试信息是开发驱动的很是重要的手段,但DebugView默认在WINDOWS 10下却没法获取内核的调试日志,驱动调用KdPint/DbgPrint等的打印结果是没法被DebugView给捕捉到的。设置方法以下(复制下面的代码到txt文件。改后缀为.reg后执行(看清楚了是.reg不是.bat敲打),而后重启电脑):

 
  1. Windows Registry Editor Version 5.00

  2.  
  3. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]

  4. "DEFAULT"=dword:0000000f

2)还有本身编译出来的驱动要使用编译的Debug版原本测试,使用KdPrint打印须要显示的调试信息。下面是在Win10 64位的虚拟机中用此安装程序,加载64位的驱动以及用DebugView查看驱动打印消息的截图结果。DebugView中须要勾选Capture Kernel选项。

 

六、在VS2015中下断点进行调试

若是你第五部已经完成了,而且在DebugView中已经可以输出调试的打印信息了,辣么骚年你已经离成功只有一部之遥了大笑

建立一个驱动工程,WDK10提供的模板中根本没有提供NT驱动模板,咱们如何建立NT驱动呢?
解决:其实虽然没有提供NT模板,可是咱们能够创建WDM空模板工程,而后再本身添加文件,编译,获得的也就是NT驱动了。

驱动工程中会帮你创建一个inf文件,NT是使用不到的,能够直接删除。咱们直接添加一个MyDriver.c,后缀必须是.c。若是后缀是.cpp,编译会报错:没法解析的外部符号 _DriverEntry@8,该符号在函数 _GsDriverEntry@8 中被引用  。

在文件中添加测试代码。

 
  1. #include <ntifs.h>

  2.  
  3. VOID DriverUnload(PDRIVER_OBJECT objDriver)

  4. {

  5. // 避免编译器关于未引用参数的警告

  6. UNREFERENCED_PARAMETER(objDriver);

  7.  
  8. // 什么也不作,只打印一行字符串

  9. KdPrint(("My Dirver is Ending..."));

  10. }

  11.  
  12. NTSTATUS DriverEntry(PDRIVER_OBJECT objDriver, PUNICODE_STRING strRegPath)

  13. {

  14. // 避免编译器关于未引用参数的警告

  15. UNREFERENCED_PARAMETER(strRegPath);

  16.  
  17. // 打印一行字符串,并注册驱动卸载函数,以便于驱动卸载

  18. KdPrint(("My Dirver Is Starting!\r\n"));

  19.  
  20. objDriver->DriverUnload = DriverUnload;

  21.  
  22. return STATUS_SUCCESS;

  23. }

编译,报错,没有关系,这些都是由于安全警告等级过高了,咱们能够下降编译器警告等级的方式解决:

执行编译,编译的时候选择Debug模式,选择X64的选项(由于咱们的虚拟机使用的是64位的系统,不可以运行x86的驱动,若是你编译出来的是x86的驱动,用上的工具安装是能够,可是启动失败提示阻止运行之类的)。编译成功后,按照上面的第五步进行安装测试。

不知不觉感受已经写了好长了。。。。奋斗抽口烟压压精。好吧我不抽烟的。。。。。继续。若是上述的驱动成功编译出来了。辣么如今咱们开始附加虚拟机的内核进行调试了。

首先把虚拟机的系统内核附加到VS2015,具体步骤见下图:

选中内核调试模式、选本身配置的那个电脑、选中下面列表中内核。见下图

点击附加,而后出现下图界面,点击一下所有中断。

而后系统就断下了,虚拟机的系统咱们鼠标已经点不了,如今系统处于挂起状态了。见下图

如今咱们能够到源代码中下断点了。我就随便下个断点了,见图:

而后咱们在下面的Debugger Immediate Winddow窗口的 Kd>  一行输入命令 g 让系统运行起来。这样虚拟机中的系统又能够点击了。

 

最后一步了。使用咱们刚刚创建的驱动工程编译出来的.sys驱动文件拷贝到虚拟机中。用第五步的工具进行安装、启动。启动的时候自动触发VS2015中的下的断点。至此能够像平时咱们调试程序同样进行单步调试了。

注意事项:一、必定要拷贝Debug版本的进行调试。

                  二、拷贝到虚拟机中的.sys文件必定要是你源码编译出来的。

                  三、若是改动了源码后必定要从新拷贝一份新的驱动文件到虚拟机中调试,不然没法触发断点的。

 

3、关于驱动签名

增长一点关于驱动签名的吧,有不少小伙伴编译成功后,驱动安装的时候一直弹出下面的这个图片,驱动没有签名被系统阻止安装,解决方案百度上面说的基本是每次开机都进入启动设置中----禁用驱动签名强制、bcdedit  nointegritychecks on 或者 loadoptions DDISABLE_INTEGRITY_CHECKS等。这些方法都是之前的方法基本都没什么用了。

下面提供两个可用方法:

1)使用过时签名(下载个过时签名给驱动签上,把系统时间改到签名有效期内)。签名有版权问题东西就不提供了,本身到看雪能搜到。

2)使用UPGDSED(能够同时关闭PathGuard跟驱动强制签名)使用说明见下:

下载地址:https://github.com/hfiref0x/UPGDSED

管理员权限运行patch.exe,按照提示输入大写的CONTINUE按回车确认,patch完成后输入Enter退出,重启系统用另一个启动项启动系统。本人在windows10 企业版(15063)测试成功,能够不开启测试签名模式下加载64位驱动。

4、采坑

       

1.关防火墙,两边都能ping通才行

       2. Solution: Log in to the target computer with an admin account. Go to 'Edit Local Users and Groups'.  You should see the 'WDKRemoteUser' in the list. Right-click the user and 'Set Password...'. Put in a password that will work  with your group password policy. Sign out and login as ".\WDKRemoteUser" with your current password. Retry the provisioning with the corresponding debug settings. It will run through the provisioning correctly this time.

Please leave a comment if you have any issues. I'll take a look and try to replicate it.

 

       3.That's a known issue with provisioning a Windows Server target machine. Windows Server does not have restore points, so creating a restore point will always fail.

If all the other steps passed (which is your case), you can safely ignore the restore point failure, and simply click "Next" and then "Finish"once provisioning complete. You will then be able to use the server machine as a target, even though the restore point step failed.

相关文章
相关标签/搜索