windows驱动开发环境搭建以及helloworld

Windows驱动开发的环境搭建以及helloworld程序运行~
还是写个文档记下来,免得一段时间不用又忘了。。~

参考链接:
http://www.mycode.net.cn/language/cpp/1771.html
http://blog.csdn.net/silvervi/article/details/6014619
https://www.mobibrw.com/2014/1404

开发环境搭建

一、开发及测试环境

开发机系统 : win10, 64位
测试机系统: win10 或者 win7, 64位
开发软件: visual stdio 2015, (vs2017不支持,反正目前官网上是这么说的)

二、安装相应的开发软件

官方开发软件下载链接:
https://developer.microsoft.com/zh-cn/windows/hardware/windows-driver-kit

windows-sdk-install.png

按照官网的教程:

  1. 安装 vs2015, 其中community是免费的,我直接安装这个版本了,反正功能够用~。
    打开的时候记得安装Visual C++选项,vs2015-install.png

此处可以不选“通用Windows应用开发工具”中的SDK,因为可以从下面的步骤中手动安装。

  1. 安装 Windows SDK, 直接从官网指定的链接下载安装就行;
  2. 安装 Windows WDK, 同样直接从官网指定的链接下载安装;

记得安装的SDK 和 WDK 的版本号必须完全相同,所以我选择SDK和WDK都从官网给的链接上下载安装,避免vs2015中安装的SDK和自己下载的WDK版本不同。

当然WDK和SDK下下来的时候是个执行文件,打开后可以选择直接安装或者近下载,反正都行,我选择先下载下来,后面自己安装,比较这么大软件下一次太久~~

我记得WDK安装的时候会提示什么将无法开发现代应用程序之类的提示,直接接受并继续~~,其实对其他程序开发有什么影响我也不太清楚,反正我这个环境只开发windows驱动程序而已。

helloworld程序

一、新建驱动程序

打开VS2015,新建一个空的KMDF项目,如下图所示:
vs-new-project.jpg

然后在Source Files中新建代码文件 DriverEntry.c,


记得是C文件,不是C++文件,目测C++文件库存在一些区别,编译会出一些问题。
DriverEntry.jpg

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <ntifs.h>
VOID UnLoadDriver(PDRIVER_OBJECT pDriverObject)
{
KdPrint(("UnloadDriver success!"));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
KdPrint(("%wZ", pRegistryPath));
pDriverObject->DriverUnload = UnLoadDriver;
return STATUS_SUCCESS;
}

二、修改项目属性

1.警告等级:

warning.jpg

将警告等级改为3;将警告视为错误改为否;

2.修改目标平台属性;
这个属性决定你生成的程序在什么平台上运行;
此处我的测试机器是win7 64位。
target.png

3.关闭签名
turnOffSign.jpg

4.关闭inf2cat
tunOffCat2inf.jpg

接着点击生成项目~
build.jpg

在目标机器上运行

1.重启虚拟机,开机时按F8,关闭强制签名认证;
turnOffWin7Sign.png

2.安装必要的软件
将生成的.sys文件拷贝到目标机器;
下载一个InstDrv.exe,用来加载驱动程序;
下载一个Dbgview.exe,用来显示驱动的log;
两个程序都放在测试的机器里。

3.用admin权限打开Dbgview.exe程序,监控系统log;
进行一下配置:
开启Capture Kernel
dbgview1.png

连接到本地机器

4.用Admin权限打开InstDrv.exe,并选择拷贝进来的.sys文件;
点击安装、启动,就可以在gdbview.exe里看到相应的log了。
InstDrv.png

result.png

点击停止、卸载,一样看到log。

如果没有出现log信息,win7系统可尝试修改下系统配置重试:
打开注册表HKLM/SYSTEM/CurrentControlSet/Control/Session Manager,打开或者创建子项Debug Print Filter,然后新建一个DWORD值DEFAULT,将其设置成0xF,重启即可。

其他

1.驱动签名

到这里,基本开发环境和测试环境都可以了,helloworld也运行通了。
这里其实关闭win7的强制签名机制,在测试时还是可能遇到很多崩溃的问题,其实可以通过进行测试签名来解决这些问题,过程也很简单,参考链接:https://qwertwwwe.github.io/2017/08/11/Windows%E9%A9%B1%E5%8A%A8%E5%BC%80%E5%8F%91-%E6%B5%8B%E8%AF%95%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%90%8D/

如果要正式发布驱动程序,让其可以在任意计算机上安装执行,则需要购买证书,个人版大概几百RMB一年吧~~

2.驱动加载

目前的加载驱动用这个InstDrv.exe不是很方便,其实我后来看到的一些程序,基本都不用这么加载,直接右键安装,然后在cmd里启动就行了,这个和驱动类型有关;

3.Samples学习
微软给出了各种类型的驱动samples,拿来学习很好用,参考链接:
https://github.com/Microsoft/Windows-driver-samples