官方给出了一个详细的文档,可以之间参看官方问文档进行学习:编写 Hello World Windows 驱动程序 (KMDF) - Windows drivers | Microsoft Learn
安装只需要如下三个软件包:
注意:第二项和第三项版本必须是对应的,这里都是使用最新的版本。
1 打开VS,然后搜索选择Kernel Mode Driver, Empty(KMDF),然后点击下一步。
2 新建项目KmdfHelloWorld,勾选“将方案和项目放在同一个目录当中”复选框,然后点击创建。
3 选择解决方案窗口中的KmdHelloWord,右键->添加->新建项,然后在弹出窗口中新建Driver.c。
4 在Driver.c中写入驱动代码(此为微软提供的示例程序)
- #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;
- }
我在测试示例代码的过程中,出现了MSB401:SignTask任务意外失败的错误。
双击错误,进入该错误对应的文件,其路径为D:\Windows Kits\10\build\WindowsDriver.Common.targets,搜索,将
<SignMode Condition="'$(SignMode)' == '' and '$(EnableTestSign)' == 'true'">Test Sign</SignMode>
中的Test Sign改为Off,即整行变为
<SignMode Condition="'$(SignMode)' == '' and '$(EnableTestSign)' == 'true'">Off</SignMode>
注1:网上搜到的解决方案均为:进入右键属性->Driver signing->General,然后更改SignMode从Test Sign为Off。但更改之后没有变化,所以在此直接手动更改其对应的文件。
注2:官方教程中要求更改Wpp跟踪,即右键属性->Wpp wrap>General:将 Run Wpp tracing”设置为“否”。但实际操作时发现这项本来就是否,所以就没写这步。更改之后,再重新生成,就可在项目的debug文件夹\x64\Debug下发现KmdfHelloWorld.sys。
解决方法如下很多中,但由于本人本地之前安装了vs2017,同时第一次安装这些驱动包没有经验导致返工很多次。最后的结果是前面三种方式始终没有办法解决,最后通过第四种方式修改解决掉这个问题。
错误如下
MSB803 .找不到Windows SDK版本 10.0.18362.0.请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决方案并重新选择“重新解决方案目标``来更改SDK版本`
解决方法一
首先检查SDK是否安装 如果没有安装 把其勾选上进行安装
我已经安装了 Windows 10 SDK 10.0.18362.0 ,如果你出现问题是因为没有安装,那么这个方法就是解决办法。
解决方法二
重新解决方案目标来更改SDK版本
项目——重定目标解决方案——然后选择版本
解决办法三
还有一种办法 去官网上下载SDK 然后安装
下面是网址 https://developer.microsoft.com/zh-cn/windows/downloads/windows-10-sdk/
解决方法四
电脑明明安装了Windows SDK,但就是提示找不到:
MSB8036 找不到 Windows SDK 版本 10.0.19041.0。请安装所需版本的 Windows
SDK,或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SDK 版本。
原因:VS确定SDK是通过一个sdkmanifest.xml来找的,以前的SDK版本这个文件都是在windows sdk根目录下,
我这里可能是这台机器同时装了VS2017的原因。而新版本的这个文件在SDK根目录是找不到的,所以需要增加一下条件,不要在根目录下找,指定SDK目录为当前目录即可。
解决办法:
1、找到UAP.props文件,路径在:
“SDK根目录\DesignTime\CommonConfiguration\Neutral\UAP\10.0.19041.0\”
像我的SDK根目录在D:\Windows Kits\10,全路径就是
“D:\Windows Kits\10\DesignTime\CommonConfiguration\Neutral\UAP\10.0.19041.0”
其他版本的SDK应该也是一样,将版本号替换就好。
1、打开UAP.props文件,找到第5行:
如果通过重新安装也无法解决问题,那么有可能是UAP.props 文件出了问题
首先找到Kits 文件夹 一般是在C盘 Windows文件夹里。
然后按照 Kits/10/Design Time /CommonConfiguration/Neutral/UAP/10.018.362.0/UAP.props的顺序依次打开
加入蓝色阴影部分Condition="'$(WindowsSdkDir)' == ''",然后保存 重启vs 2019