当前位置: 首页 > news >正文

Windows11+VS2019驱动开发环境搭建

官方给出了一个详细的文档,可以之间参看官方问文档进行学习:编写 Hello World Windows 驱动程序 (KMDF) - Windows drivers | Microsoft Learn

安装只需要如下三个软件包:

  • 安装VS2019,下载地址:VS2019。安装时注意选中VC++桌面开发。
  • 下载Windows11 SDK,此为iso文件,下载完成打开,双击WinSDKSetup.exe进行安装,安装成功后按照提示重启。
  • 下载Windows 11 WDK安装工具,下载完成后双击打开,默认下载安装,安装成功后会打开WDK.vsix文件。如果没有打开,在路径D:\Windows Kits\10\Vsix\VS2019下可找到,双击安装。后面部分内容的安装目的是将这个WDK工具嵌入到VS2019当中,开发过程直接索引到对应的头文件。

注意:第二项和第三项版本必须是对应的,这里都是使用最新的版本。

Hello World驱动测试

1. 项目创建

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;
}


2. MSB401: SignTask错误解决

我在测试示例代码的过程中,出现了MSB401:SignTask任务意外失败的错误。

双击错误,进入该错误对应的文件,其路径为D:\Windows Kits\10\build\WindowsDriver.Common.targets,搜索</SignMode>,将

 <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。

3. MSB803 找不到相应版本Windows SDK

解决方法如下很多中,但由于本人本地之前安装了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

相关文章:

  • 文件防泄密系统如何保障企业文档的安全性?
  • 【数据结构与算法】ArrayList与顺序表(上)
  • 【前端进阶】-TypeScript类型声明文件详解及使用说明
  • [Spring boot] Spring boot 实现发送邮件功能
  • 万字指针超详细总结
  • 列表页常见 hook 封装
  • 集合_HashSet(HashMap)扩容机制源码简析
  • Spring注解@Qualifier的详细用法你知道几种「扩展点实战系列」- 第444篇
  • uni-app 微信小程序中关于 map 地图使用案例分享
  • 工业级成熟航运港口人工智能产品全球前三船公司及港口码头落地,中国上海人工智能独角兽中集飞瞳全球应用最广规模最大最先进港航AI企业
  • CSS基础篇---02选择器进阶、背景样式、显示模式
  • 【C语言】自定义类型 —— 结构体
  • 千万级用户ms级抽奖N名设计方案
  • 2022第五空间WEBMISC
  • 说几句得罪人的大实话
  • CODING 缺陷管理功能正式开始公测
  • css选择器
  • eclipse(luna)创建web工程
  • egg(89)--egg之redis的发布和订阅
  • Github访问慢解决办法
  • js学习笔记
  • mysql 数据库四种事务隔离级别
  • Netty源码解析1-Buffer
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python中eval与exec的使用及区别
  • SpingCloudBus整合RabbitMQ
  • vuex 学习笔记 01
  • vue中实现单选
  • webpack入门学习手记(二)
  • 第2章 网络文档
  • 高性能JavaScript阅读简记(三)
  • 官方解决所有 npm 全局安装权限问题
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端技术周刊 2019-02-11 Serverless
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 线性表及其算法(java实现)
  • 新手搭建网站的主要流程
  • #pragma pack(1)
  • #WEB前端(HTML属性)
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (poj1.2.1)1970(筛选法模拟)
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)编辑寄语:因为爱心,所以美丽
  • .axf 转化 .bin文件 的方法
  • .gitignore
  • .gitignore文件设置了忽略但不生效