Windows Driver Kit 是一种完全集成的驱动程序开发工具包,它包含 WinDDK 用于测试 Windows 驱动器的可靠性和稳定性,本次实验使用的是 WDK8.1 驱动开发工具包,该工具包支持 Windows 7到 Windows 10 系统的驱动开发。

VS2013+WDK8.1 驱动开发环境的搭建我研究了很长时间今天总算搭建出来了,而且中途没有错误,这里就把搭建过程分享出来,首先介绍一下我的实验环境:

宿主操作系统:Windows 10 LTSC 企业版

驱动测试环境:Windows 7 x86 企业版

编译器的版本:Visual Studio Express 2013

驱动框架版本:Windows Driver Kit 8.1 (精简)

内核调试工具:WinDBG 10

驱动工具打包链接:https://pan.baidu.com/s/18VIXKdFdfu7ZuKOql7Z_Iw 提取码:9se4

配置VS+WDK 驱动开发环境

首先你需要先安装好Visual Studio 2013的开发环境,然后再安装Windows Driver Kit 8.1的驱动开发工具包,这个工具包安装好以后1.5G左右,不过我已经把这个安装包中的关键库文件提取出来了,提取出的文件只有80MB,直接将提取好的WinDDK.zip解压缩到指定文件中,并配置环境即可使用,省去了安装WDK的麻烦。

1.这里直接把我提取的WinDDK.zip文件解压缩到C盘根目录下,然后打开Visual Studio 开发工具,按下【Ctrl+Shift+N】新建空项目并输入项目名称为【MyDDK】即可。

2.依次选择解决方案视图 -> 源文件 -> 添加新建项,或者直接按下【Ctrl + Shift + A】快捷打开菜单,并创建【main.cpp】文件。

3.接着我们需要修改一下配置管理器,添加自定义配置管理,选择【生成】->【配置管理器】->【新建】,此处我们命名为【MyDDK】即可。

4.接着修改一下配置属性中的常规属性,点击菜单栏中的调试,选择【MyDDK属性】->【配置】->【常规】 -> 修改以下几处。

5.配置可执行文件路径与导入库路径,这里我们选择 【配置属性】 -> 【VC++目录】依次将如下信息填入配置项,如果需要编译x64位驱动只需要将x86改为x64即可,此处以x86为例。

可执行文件:
C:\WinDDK\bin
C:\WinDDK\bin\x86 包含目录:
C:\WinDDK\Include\km
C:\WinDDK\Include\um
C:\WinDDK\Include\winrt
C:\WinDDK\Include\shared 引用目录+库目录
C:\WinDDK\Lib\win7\km\x86

6.配置【C/C++优化选项】配置属性 -> C/C++ -> 所有选项 -> 依次修改下方几个关键处,如果你需要编译X64驱动需将调用约定改为【__fastcall (/Gr)】然后将预处理器定义中的【X86_改为_AMD64】即可编译64位驱动了,此处以X86配置为例。

安全检查:禁用安全检查 (/GS-)
将警告视为错误:是 (/WX)
警告等级:等级 3 (/W3)
启用C++异常:否
调用约定:__stdcall (/Gz)
优化:已禁用 (/Od)
运行库:多线程调试 (/MTd) 预处理器定义: _X86_;_DDK_;_WIN32_WINNT=0x0501;WINVER=0x0501;_NDEBUG;DBG=0;%(PreprocessorDefinitions)

7.接着需要【配置连接器】选项,选择连接器 -> 所有选项 -> 依次修改下方几个关键处。

附加选项:/IGNORE:4078 /safeseh:no
附加依赖项:ntoskrnl.lib;ndis.lib;Hal.lib;wdm.lib;wdmsec.lib;wmilib.lib
固定基址:此处需要为空
忽略所有默认库:是 (/NODEFAULTLIB)
启用增量链接:否 (/INCREMENTAL:NO)
驱动程序:驱动程序 (/Driver)
入口点:DriverEntry
生成清单:否 (/MANIFEST:NO)
生成调试信息:是 (/DEBUG)
生成映射文件:是 (/MAP)
数据执行保护:是 (/NXCOMPAT)
随机基址:此处需要清空
子系统:本机 (/SUBSYSTEM:NATIVE)

8.上方的配置已经基本完成了,接着我们编写一段驱动初始化代码,然后按下【F7】即可完成驱动的编译。

#include <ntddk.h>

VOID UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint(("Uninstall Driver Is OK \n"));
} NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath)
{
DbgPrint(("hello lyshark \n"));
Driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}

9.最后我们生成一个驱动开发模板,依次选择【文件】->【导出模板】->【项目模板】->【下一步】->【完成】即可完成模板的导出。

此时关闭VS工具,再次打开,就能直接使用我们的模板来开发驱动了,不需要每次都配置。

配置内核双机调试

WinDBG 是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试,Windbg不仅可以调试应用程序,还可以进行内核调试,结合Microsoft的Symbol Server 可以获取系统符号文件,便于应用程序和内核的调试,接下来我们将继续完成WinDBG双机调试的配置。

1.首先需要安装VMWare虚拟机,并自行安装好Windows7系统,然后在虚拟机关闭状态下添加一个管道虚拟串口,此处需要删除打印机,否则串口与打印机之间冲突。

操作步骤:编辑虚拟机设置->添加->串行端口->完成

参数配置:使用命名管道->\.\pipe\com_1->该端是服务器另一端是应用程序->轮询时主动放弃CPU

2.开启虚拟机中的Windows7系统,然后以管理员身份运行CMD命令行,连续执行下方的三条命令,依次建立启动项,并激活调试模式。

Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>bcdedit /copy {current} /d "Windwos7"
已将该项成功复制到 {2372b00a-f22b-11e9-be45-000c2971b6bf}。 C:\Users\Administrator>bcdedit /debug ON
操作成功完成。 C:\Users\Administrator>bcdedit /bootdebug ON
操作成功完成。 C:\Users\Administrator>bcdedit /timeout 10
操作成功完成。 C:\Users\Administrator>bcdedit /dbgsettings

3.默认情况下Win7下的DbgView不显示内核调试信息,为了方便测试,我们需要修改一下注册表,新建一个run.reg文件,然后运行并注册。

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Debug Print Filter]
"DEFAULT"=dword:0000000f

4.配置完成后,重新启动系统,在开机的时候选择Windows7 [启用调试程序]则系统会黑屏,说明已经正常进入调试模式了。

5.接着回到物理机上面,我们在WinDBG所在路径下创建一个Bat文件,这里就叫debug.bat 然后写入以下命令保存,直接运行这个脚本即可。

windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe

为了方便调试,可以通过【File菜单】加载符号文件,也可以按下【Ctrl+S】并输入命令 srvc:\symbolshttp://msdl.microsoft.com/download/symbols 自动下载符号保存到C盘下。

到此为止,我们的内核调试环境已经配置并能够独立工作了,接着我们编写一个简单的驱动程序,为了能让程序段下来方便调试我们在程序的开始位置加上__asm{ int 3 } 断点然后让程序执行后自动断下,最终代码如下:

#include <ntddk.h>

VOID UnDriver(PDRIVER_OBJECT driver)
{
DbgPrint(("Uninstall Driver Is OK \n"));
} NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver,PUNICODE_STRING RegistryPath)
{
__asm{ int 3 } // 内联汇编添加 int 3 断点
DbgPrint(("hello lyshark \n"));
Driver->DriverUnload = UnDriver;
return STATUS_SUCCESS;
}

6.现在我们启动Windows7系统,直接输入g命令即可让Win7跑起来,手动添加符号文件。

按下 Ctrl +S 加入以下符号文件,最后的路径是你驱动编译所在路径。

srv*c:\symbolshttp://msdl.microsoft.com/download/symbols ; C:\MyDDK\MyDDK\

当Windows系统加载完成以后,拖入我们的驱动文件wdk.sys,并通过驱动加载工具加载运行,此时Windows系统会卡死,回到WinDBG中发现已经可以进行源码调试了哈。

原创作品,转载请加出处,您添加出处是我创作的动力!

VS2013+WDK8.1 驱动开发环境配置的更多相关文章

  1. Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置

    https://blog.csdn.net/charlessimonyi/article/details/50904956 Win8.1+VS2013+WDK8.1+VirtualBox or VMw ...

  2. VS2013的x86汇编语言开发环境配置

    转载:https://blog.csdn.net/infoworld/article/details/45085415 转载:https://blog.csdn.net/u014792304/arti ...

  3. visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  4. 75.VS2013和opencv3.1.0开发环境配置

    首先要做的就是 开发环境配置,具体过程如下: Step 1:OpenCV环境变量配置 我的电脑--->属性--->高级系统设置--->高级--->环境变量--->系统变量 ...

  5. [内核编程] visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  6. XMPP开发环境配置

    首先配置XMPP开发环境配置需要的软件 先安装xampp-osx-1.8.3-5-installer.dmg 安装成功后launchpad里会多出一个XAMPP(其他),点开里面的manager-os ...

  7. Linux设备驱动开发环境的搭建(转)

    经过两周的摸索,终于对Linux设备驱动开发有了个初步的认识,下面对Linux设备驱动开发环境的搭建做个小结,以方便自己以后查询,同时也能给同道的初学者一点帮助. 刚接触Linux设备驱动时,初学者往 ...

  8. Kinect for Windows SDK开发入门(一):开发环境配置

    [译]Kinect for Windows SDK开发入门(一):开发环境配置 前几天无意中看到微软发布了Kinect for windows sensor,进去看了一下Kinect应用的例子,发现K ...

  9. Unity3D Android手机开发环境配置

    Unity3D Android手机开发环境配置 Date:2014-01-01 07:09 1.配置eclipse环境:首先在官网下载安装包:http://developer.android.com/ ...

随机推荐

  1. LeetCode设计实现题(一)

    一.LRU缓存机制(LeetCode-146) 1.1 题目描述 1.2 解题思路 思路1: 使用Map存放key,value,使用List存放key和count,count为最新的index值,每次 ...

  2. Android数据绑定DataBinding(一)入门篇

    早上看到了一篇推文"还在使用繁琐的findViewById,跟着尝试了一下DataBinding,之前使用ButteKnife就已经干掉了findViewById.因为写过微信小程序,那种在 ...

  3. How does Request.IsAuthenticated work?

    How does Request.IsAuthenticated work? MSDN Code Sample Description: The following code example uses ...

  4. [Java]某日期时间加上若干分钟得到新的日期时间

    使用Java自带类库实现日期时间增减还是比自己人工拆分编写要牢靠,代码也简洁多了. 下面代码实现了在原有日期时间上加上一些分钟得到新的日期时间的功能,稍加改造还可以实现逆向运算. 代码: packag ...

  5. Docker,就放弃了把日志写入文件

    日志配置 既然用 Docker,就放弃了把日志写入文件,直接写到标准输出. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ...

  6. KL距离(相对熵)

    KL距离,是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对熵(Relative Entropy).它衡量的是相同事件空间里的两个概率分 ...

  7. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

  8. osgText::Text osg字体

    #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #include <osgV ...

  9. Linux/CentOS下修改MAC地址

    Linux/CentOS下修改MAC地址 摘自:https://blog.csdn.net/qq_33233768/article/details/64906265 2017年03月22日 11:06 ...

  10. Egret入门学习日记 --- 第十一篇(书中 4.1~4.6节 内容)

    第十一篇(书中 4.1~4.6节 内容) 好了,到了这篇开始,前三章都记录完了. 接下来就是到第四章了. 4.1节 的内容总结一下重点: 1.resource目录下default.res.json文件 ...