Windows 10驱动开发环境配置(WDK)

最近因为有个进程很烦杀不掉,于是想到了用驱动来杀,在此记录一下在Windows 10下面配置驱动开发环境。因为程序比较简单我直接在本机载入了,大家调试的时候还是要利用虚拟机调试呀。

因为我只是驱动入门者(或者说门都没入),所以可能存在错误,欢迎大家指正。

安装WDK

我们的开发环境是Visual Studio Community 2019,已经配置好了使用C++的桌面开发环境,这时候我们还需要安装Windows Driver Kit。

我们需要从Download the Windows Driver Kit (WDK)上面下载安装包,并且联网在线安装。安装WDK完成之后会安装VS的插件,这一步需要保证网络顺畅,如果安装卡住的话可以关闭窗口,然后在WDK安装目录下面的Vsix文件夹找到安装文件手动安装。

Hello World驱动

我们首先新建一个Kernel Mode Driver,项目,并给他取名为KmdfHelloWorld。

创建完成之后在解决方案资源管理器里面的Source Files内新建项,输入Driver.c。并键入下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <ntddk.h>
#include <wdf.h>
DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD KmdfHelloWorldEvtDeviceAdd;

NTSTATUS
DriverEntry(
_In_ PDRIVER_OBJECT DriverObject,
_In_ PUNICODE_STRING RegistryPath
)
{
// NTSTATUS variable to record success or failure
NTSTATUS status = STATUS_SUCCESS;

// Allocate the driver configuration object
WDF_DRIVER_CONFIG config;

// Print "Hello World" for DriverEntry
KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: DriverEntry\n" ));

// Initialize the driver configuration object to register the
// entry point for the EvtDeviceAdd callback, KmdfHelloWorldEvtDeviceAdd
WDF_DRIVER_CONFIG_INIT(&config,
KmdfHelloWorldEvtDeviceAdd
);

// Finally, create the driver object
status = WdfDriverCreate(DriverObject,
RegistryPath,
WDF_NO_OBJECT_ATTRIBUTES,
&config,
WDF_NO_HANDLE
);
return status;
}

NTSTATUS
KmdfHelloWorldEvtDeviceAdd(
_In_ WDFDRIVER Driver,
_Inout_ PWDFDEVICE_INIT DeviceInit
)
{
// We're not using the driver object,
// so we need to mark it as unreferenced
UNREFERENCED_PARAMETER(Driver);

NTSTATUS status;

// Allocate the device object
WDFDEVICE hDevice;

// Print "Hello World"
KdPrintEx(( DPFLTR_IHVDRIVER_ID, DPFLTR_INFO_LEVEL, "KmdfHelloWorld: KmdfHelloWorldEvtDeviceAdd\n" ));

// Create the device object
status = WdfDeviceCreate(&DeviceInit,
WDF_NO_OBJECT_ATTRIBUTES,
&hDevice
);
return status;
}

不管是Kernel Mode Driver还是WDM Driver的入口函数都是DriverEntry,这就和一般C语言程序的main一样。

上面的程序会在载入驱动的时候输出Driver Entry的信息,同时给EvtDeviceAdd注册了一个Callback函数。EvtDeviceAdd函数会在设备添加的时候被触发,对于一些驱动而言,插入设备之后就会进行一些IO操作,这时候就能在Callback里面完成。

如果你的操作系统是64位的,需要把顶部的x84架构调为x64,否则无法载入驱动。修改完成之后直接生成-生成解决方案即可。

载入驱动并显示调试信息

通常情况下这一步需要在虚拟机里面进行调试,除非你有完全的把握不会出错,下面是一个“错误”示范。

我们需要准备两个软件,一个是Dbgview,一个是OSR Driver Loader。前者用于获取调试信息,后者用于载入驱动,虽然也有人喜欢用Driver Monitor,但是因为年代太久远,很难找到原版下载。

我们先管理员权限打开这两个软件,在Dbgview中的Cature选项中做如下勾选:

然后我们需要设置Filter,否则其他调试信息太多会干扰我们。这里我们直接Include我们的字符串。

完成之后在打开OSR Driver Loader,在Driver Path里面选择我们刚刚生成的驱动,并分别点击最下面的Register Service和Start Service。

这时候你应该能在Dbgview里面看到驱动载入的信息:

最后请不要忘记Stop Service(如果能够)和Unregister Service。

疑难解答

关闭Windows 10强制驱动签名

目前Windows 10的驱动证书校验需要有效的EV SSL证书,而testsign似乎无效,所以我们需要启用Windows测试模式。管理员打开命令提示符,执行:bcdedit.exe /set testsigning on。重启之后你的屏幕右下角会显示Windows测试模式。需要关闭的话on换成off即可。

签名的时候出现时间错误

在项目-属性-Inf2Cat内,把Use Local Time设置为

参考链接

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 许可协议。转载需要标明作者,并以超链接的方式指向原文。
  • Copyrights © 2020 Kevin Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~