文档章节

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

simpower
 simpower
发布于 2018/07/27 18:17
字数 4885
阅读 2146
收藏 0

一、准备工作

1  系统环境:Win10系统

2  开发工具:VS2015

3  驱动开发工具:WDK10

4  Windows SDKSDK10(安装的时候必须全部勾选安装,否则编译会出现缺少waring.h等头文件之类的错误)

5  VM虚拟机:VMware WorkStation 12

 

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

 

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

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

注意事项:

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

 

二、具体操作步骤

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

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

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

 

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

    以管理员身份,在虚拟机命令行模式下运行如下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

 

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

因为VS2015可以调试x86 x64两种驱动,根据被调试系统选择不同的文件拷贝到虚拟机安装,我的是64位的选择x64

 

4、VS2015开发工具配置

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

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

配置界面,下面两个选项第一项由VS2015帮我们创建一个WDKuser测试账户,自动打开测试模式等。第二个是使用我们自己配置的参数。由于上面我们已经配置了串口参数 、设置了调试模式所以我们选择第二个就行了。

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

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

 

5、使用工具安装调试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选项。

 

6、在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中的下的断点。至此可以像平时我们调试程序一样进行单步调试了。

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

                  2、拷贝到虚拟机中的.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位驱动。

四、采坑

      

一、准备工作

1  系统环境:Win10系统

2  开发工具:VS2015

3  驱动开发工具:WDK10

4  Windows SDKSDK10(安装的时候必须全部勾选安装,否则编译会出现缺少waring.h等头文件之类的错误)

5  VM虚拟机:VMware WorkStation 12

 

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

 

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

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

注意事项:

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

 

二、具体操作步骤

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

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

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

 

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

    以管理员身份,在虚拟机命令行模式下运行如下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

 

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

因为VS2015可以调试x86 x64两种驱动,根据被调试系统选择不同的文件拷贝到虚拟机安装,我的是64位的选择x64

 

4、VS2015开发工具配置

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

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

配置界面,下面两个选项第一项由VS2015帮我们创建一个WDKuser测试账户,自动打开测试模式等。第二个是使用我们自己配置的参数。由于上面我们已经配置了串口参数 、设置了调试模式所以我们选择第二个就行了。

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

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

 

5、使用工具安装调试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选项。

 

6、在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中的下的断点。至此可以像平时我们调试程序一样进行单步调试了。

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

                  2、拷贝到虚拟机中的.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位驱动。

四、采坑

       

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.

本文转载自:https://blog.csdn.net/qing666888/article/details/50858272

simpower
粉丝 28
博文 682
码字总数 53364
作品 0
海淀
程序员
私信 提问
Win10与VS2015搭建内核驱动开发环境遇到的问题

vs联机调试自动化配置失败:清除wdkremoteuser的密码,但是企业版win10还是不成功。 关于在Win10与vs2015环境下搭建内核驱动开发环境看这两篇文章: WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟...

simpower
07/03
54
0
Windows下React-Native如何调试和运行iOS

由于前段时间写了一个React-Native的项目Mung,就想把打包出.apk和.ipa,我个人一直从事Android开发所以安卓app打包就没什么问题了,但ios打包问题就大了,最大的问题就是我没有Mac,自己电脑...

mochixuan
2017/10/17
0
0
Windows下React-Native如何调试和运行iOS

由于前段时间写了一个React-Native的项目Mung,就想把打包出.apk和.ipa,我个人一直从事Android开发所以安卓app打包就没什么问题了,但ios打包问题就大了,最大的问题就是我没有Mac,自己电脑...

mochixuan
2017/10/17
0
0
WIN10 + VS2015 + WDK10 + SDK10 + VM虚拟机驱动开发调试环境搭建

一、准备工作 1 系统环境:Win10系统 2 开发工具:VS2015 3 驱动开发工具:WDK10 4 Windows SDK:SDK10(安装的时候必须全部勾选安装,否则编译会出现缺少waring.h等头文件之类的错误) 5 VM虚...

simpower
2018/06/11
114
0
使用Xamarin开发手机聊天程序 -- 基础篇(大量图文讲解 step by step,附源码下载)

如果是.NET开发人员,想学习手机应用开发(Android和iOS),Xamarin 无疑是最好的选择,编写一次,即可发布到Android和iOS平台,真是利器中的利器啊!而且,Xamarin已经被微软收购并被大力推...

CSharpKit
2017/12/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

POC挖矿没有前途

最好的工作量证明是能力证明,能力不适合存储。望文生义,能力的本质意义是“能”和“力”(所有的词汇都按照望文生义理解,因为所有不能望文生义的词汇都是不良的已经被前人修正或将来被后人...

NTMiner
28分钟前
7
0
1.3UiPath变量的介绍和使用

一、变量 变量主要用于存储数据,它在RPA中扮演重要的数据传递角色,是RPA编程不可或缺的一部分。它包括变量名称和变量的值,变量的值支持多种数据类型,包括从通用值,文本,数字,数据表,...

chenshi178
29分钟前
3
0
C#将文件保存到Oracle的BLOB字段

private void button1_Click(object sender, EventArgs e) { string cnnstr = "provider=OraOLEDB.Oracle;data source=HWQY;User Id=HWQY;Password=HWQY123;"; OleDbConnection con = new Ol......

_Somuns
37分钟前
3
0
微服务中如何使用RestTemplate优雅调用API(拦截器、异常处理、消息转换)

关注我,可以获取最新知识、经典面试题以及技术分享   在微服务中,rest服务互相调用是很普遍的,我们该如何优雅地调用,其实在Spring框架使用RestTemplate类可以优雅地进行rest服务互相调...

ccww_
39分钟前
22
0
沙龙报名 | 京东云DevOps——自动化运维技术实践

随着互联网技术的发展,越来越多企业开始认识DevOps重要性,在企业内部推进实施DevOps,期望获得更好的软件质量,缩短软件开发生命周期,提高服务稳定性。但在DevOps 的实施与落地的过程中,...

京东云技术新知
44分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部