Windows 驱动开发环境搭建

Windows 驱动开发环境搭建及 windbg 调试工具安装使用

  • 引言
  • 了解 Windows 驱动开发环境
  • 下载 Windows 驱动开发环境
    • 根据需要下载安装对应版本的 Visual Studio
    • 下载安装对应的 WDK 工具包
  • 编写第一个驱动代码
  • 总结
  • 参考资料


引言

对于 Windows 驱动开发,在微软官方的文档中其实有很多有用的文档来进行讲解和学习,这里将驱动开发统一归类成了 Windows 硬件开发(https://learn.microsoft.com/zh-cn/windows-hardware/drivers/),在这个链接的相关文档中能够找到我们所需要的所有内容(由于Windows的不开源,所以我们对于Windows相关的学习要全部依赖官方释放的资料)。

开始学习 Windows 驱动开发,首先需要搭建属于自己的开发环境(这样在学习过程中能够自己尝试演示、验证),Windows 下的开发工作很多都依赖复杂的开发环境搭建,这部分工作量还挺大(相比 Linux 环境下),这是由于 Windows 的开发 IDE 虽然部署复杂但是使用起来会节省(掩盖)很多操作。

本章的主要内容如下:

  • 了解 Windows 驱动开发环境
  • 下载 Windows 驱动开发环境
  • 编写一个最简单的 NT 驱动
  • 编译完成 NT 驱动(表示当前开发环境已经搭建完成),后续在调试中会演示安装驱动及调试过程。

了解 Windows 驱动开发环境

早先的 Windows 驱动开发环境更多是通过 VC++ 来进行,结合使用 Windows 驱动开发工具包(WDK)进行编译完成。但是我接触这部分内容的时候 Windows 已经更新发布了 Windows11 了,所以对 Windows 驱动开发工具这部分也有了很大的变化和优化。

现如今,Windows 驱动程序开发环境和 Windows 调试器已集成到 Microsoft Visual Studio 中。 在此集成的驱动程序开发环境中,Visual Studio 界面中提供有编码、构建、打包、部署和测试驱动程序所需的大部分工具。Visual Studio 可以说是 Windows 操作系统中软件开发的利器,通过这个 IDE 我们可以进行 Windows 驱动开发、Windows 界面应用开发、Windows 程序调试等等。

所以,我们现在要部署 Windows 驱动开发环境,就需要先安装 Visual Studio,然后再安装 Windows 驱动开发工具包(WDK)。 要了解如何获取 Visual Studio 和 WDK,请访问 WDK 设置和下载页面(WDK 设置和下载页面)。 Windows 调试工具(Windows调试工具)包含在 WDK 安装中。

WDK 使用 MSBuild.exe,Visual Studio 用户界面中提供有此程序,并且它也可以作为命令行工具提供。 在 Visual Studio 环境中创建的驱动程序使用项目和解决方案文件来描述项目或项目组。 Visual Studio 环境提供有用于将旧源和目录文件转换成项目和解决方案文件的工具。

Visual Studio 环境提供适用于以下项的模板:

  • 新驱动程序
  • 驱动程序包
  • 新测试
  • 现有测试的增强功能
  • 自定义驱动程序部署脚本

在 Visual Studio 环境中,你可以配置构建流程,使其自动创建和签署驱动程序包。 Visual Studio 中提供了静态和实时分析工具。 你可以配置用于测试驱动程序的目标计算机,并在每次重建时将你的驱动程序自动部署到目标计算机。 你可以从多个运行时测试中进行选择,也可以编写自己的测试。

下载 Windows 驱动开发环境

下载安装 Windows 驱动开发环境的操作步骤:

  1. 选择合适的 Visual Studio 版本进行下载安装;
  2. 选择对应的 WDK 版本进行下载安装;

根据需要下载安装对应版本的 Visual Studio

由于 Windows 操作系统的内核版本不同导致我们对于要开发 Windows 驱动也需要考虑该驱动要适配的 Windows 版本,不同的目标操作系统版本需要使用到不同版本的 VS 开发环境和不同版本的 WDK 包。具体可以参考如下表格内容:

下表指明了不同版本的 WDK 需要的 Visual Studio 版本。

Windows 目标版本Visual Studio 版本
Windows 11 版本 21H2、Windows Server 2022、Windows 10 版本 2004、Windows 10 版本 1903Visual Studio Community 2019、Visual Studio Professional 2019、Visual Studio Enterprise 2019
Windows 10 版本 1809、Windows 10 版本 1803、Windows 10 版本 1709Visual Studio Community 2017、Visual Studio Professional 2017、Visual Studio Enterprise 2017
Windows 10 版本 1703、Windows 10 版本 1607Visual Studio Express 2015 桌面版、Visual Studio Community 2015、Visual Studio Professional 2015、Visual Studio Enterprise 2015
Windows 8.1 更新、Windows 8.1Visual Studio 2013
Windows 8Visual Studio Professional 2012、Visual Studio Ultimate 2012

安装 Visual Studio 时,选择 使用 C++ 的桌面开发 工作负载。 Windows 10 软件开发工具包 (SDK) 会自动包括在内,并显示在右侧的“摘要”窗格中。

若要开发 Arm/Arm64 驱动程序,请选择 单个组件,然后在 编译器、生成工具和运行时 下选择 适用于 Arm/Arm64 的 Visual C++ 编译器和库

这里需要注意一下,由于我的版本比较高,只需要下载 Visual Studio 即可(内部包含了 Windows SDK)。如果开发的目标系统运行 Windows 10 版本 1607 或 Windows 10 版本 1703,则应安装 Visual Studio 2015,然后再下载并安装适用于目标 Windows 10 版本的 Windows SDK 版本,如下表所示。

Windows 目标版本Windows SDK 版本
Windows 10 版本 1703适用于 Windows 10.0.15063.468 的 Windows SDK
Windows 10 版本 1607适用于 Windows 10.0.14393.795 的 Windows SDK
Windows 8.1适用于 Windows 8.1 的 Windows SDK
Windows 8适用于 Windows 8 的 Windows SDK

Windows SDK 未包含在 Visual Studio 2015 中,因此必须单独安装 SDK。 更高版本的 Visual Studio 包含 Windows SDK。

我这里选择的目标 Windows 操作系统版本是 Windows 10 22H2 版本。
在这里插入图片描述
选择 Visual Studio 版本只需要考虑 Windows 大版本即可,不过要注意 Windows 10 1903、Windows 10 1809、Windows 10 1703 这几个有跨度的版本所需要的 Visual Studio 版本是不一致的,分别对应 2019、2017、2015。

我们这里选择下载使用 Visual Studio 2019 社区版。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我这里已经安装完成,并且我由于不同的目标版本原因,还同时安装了不同版本的 Visual Studio,这里只需要安装 2019 版本,并且安装只需要选择 使用C++的桌面开发

在这里插入图片描述
在这里插入图片描述
这里选择完成后,执行下载安装即可。(这个过程可能需要一点时间,并且要确保网络正常)

完成后启动打开就能看到 Visual Studio 2019 的启动界面了。
在这里插入图片描述
现在我们还没有安装对应的 WDK(Windows 驱动开发包),所以现在选择新建项目还没有 driver 对应的解决方案可以选择。

下载安装对应的 WDK 工具包

和 Visual Studio 选择版本一样,我们也需要根据情况选择安装对应的 WDK 版本。

WDK 与 Visual Studio 和 Windows 调试工具 (WinDbg) 集成在一起。 此集成环境提供了开发、生成、打包、部署、测试和调试驱动程序所需的工具。(从 Windows 10 版本 1709 开始,安装 WDK 时会默认安装 Visual Studio 的 WDK 扩展。 这些扩展是将 WDK 与 Visual Studio 集成所必需的。)

Windows 目标版本WDK 和相关下载
Windows 11 版本 22H2下载 Windows 驱动程序工具包 (WDK)
Windows 11 版本 21H2Windows 11 版本 21H2 WDK
Windows Server 2022适用于 Windows Server 2022 的 WDK
Windows 10 版本 22H2、Windows 10 版本 21H2、Windows 10,版本 21H1、Windows 10 版本 20H2、Windows 10 版本 2004适用于 Windows 10 版本 2004 的 WDK
Windows 10 版本 1909、Windows 10 版本 1903适用于 Windows 10 版本 1903 的 WDK
Windows 10 版本 1809、Windows Server 2019适用于 Windows 10 版本 1809 的 WDK
Windows 10 版本 1803适用于 Windows 10 版本 1803 的 WDK
Windows 10 版本 1709适用于 Windows 10 版本 1709 的 WDK
Windows 10 版本 1703适用于 Windows 10 版本 1703 的 WDK
Windows 10 版本 1607、Windows 10 版本 1511、Windows 10 版本 1507、Windows Server 2016适用于 Windows 10 版本 1607 的 WDK
Windows 8.1 更新WDK 8.1 更新仅 (英语) - 永久不可用、WDK 8.1 更新测试包仅 (英语) - 永久不可用、WDK 8.1 示例(注意:可以使用从 Windows 10 版本 1607 到 Windows 11 版本 21H2 的任何 WDK 为Windows 8.1生成驱动程序。)
Windows 7WDK 7.1.0
Windows 8WDK 8(仅英语)、WDK 8 可再发行组件(仅英语)、WDK 8 示例

由于我们需要的是 Windows10 22H2 对应版本的 WDK,所以根据上表对应选择适用于 Windows 10 版本 2004 的 WDK。(wdksetup.exe)

这个安装过程就很简单了,只需要一直 next 到最后就完成安装了。当这里安装完成 WDK 后,我们再次打开 Visual Studio 2019,然后选择新建项目,就可以在项目类型中选择 Driver 了,这就表示我们的 Windows 驱动开发环境已经搭建完成了。

编写第一个驱动代码

在上一部分,我们已经完成了 Windows 的驱动开发环境部署。这里,就尝试编写一个最简单的驱动来验证我们的环境。

  1. 打开 Visual Studio 2019,选择新建项目,项目类型中选择 Driver,然后选择 Kernel Model Driver(KMDF),点击 下一步
    在这里插入图片描述

  2. 输入新建项目名称、存储路径,点击 创建
    在这里插入图片描述
    IDE 工具会自动帮我们完成基础的文件创建,在解决方案资源管理器中可以看到已经自动创建的文件。
    在这里插入图片描述

  3. 什么都不改,直接选择 生成- 生成解决方案,会编译生成一个空的 Windows driver 文件在刚刚我们存储的路径下
    在这里插入图片描述
    这里就完成了一个最基本的 Windows driver 的创建和编译生成。
    在后面的章节中,我们了解到关于 Windows 驱动相关的概念后,再进行添加代码和部署、调试等操作。

总结

本章内容简单介绍了关于 Windows 驱动开发环境的相关知识,并基于 Windows 10 22H2 的操作系统版本进行了 Windows 驱动开发环境的部署验证。要完成 Windows 驱动开发环境需要根据自己开发的目标操作系统版本选择对应的 Visual Studio 版本及 WDK(Windows 驱动工具包)版本。安装步骤也是先安装 Visual Studio 后安装 WDK。如果是高版本的 Windows 操作系统这两步就完成了(因为需要的 Windows SDK 已经集成到 Visual Studio 中),如果是 Visual Studio 2015 版本以下则需要再单独下载安装 Windows SDK 。

通过本章内容的学习,相信大家已经能够在自己的机器上部署完成 Windows 驱动开发环境了。后面就可以专心学习关于 Windows 驱动相关的技术内容了。

参考资料

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/other-wdk-downloads

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32876.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows 下安装 mysql-8.0.25 解压版

介绍 此文介绍 mysql-8.0.25-winx64 的 zip 解压版,在 windows 下的安装与配置过程。 官方下载 官网下载页: https://downloads.mysql.com/archives/community/ 进入官网,选择默认版本就行,不需要包含测试工具套件的版本 本地解…

【spring源码系列-03】xml配置文件启动spring时refresh的前置工作

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

[RocketMQ] Consumer消费者启动主要流程源码 (六)

客户端常用的消费者类是DefaultMQPushConsumer, DefaultMQPushConsumer的构造器以及start方法的源码。 1.创建DefaultMQPushConsumer实例 最终都是调用下面四个参数的构造函数: /*** 创建DefaultMQPushConsumer实例** param namespace namespace地址* par…

两两交换链表中的节点(LeetCode 24)

题目 24. 两两交换链表中的节点 思路 最开始自己画,越画越复杂比较复杂,写不出来!(呜呜)去看了解题思路,发现只需要三步。,按以下思路写了代码,循环停止那里的条件我还以有更好的写…

【Docker】Docker Desktop更换非C盘符(减轻占用率)

Win10中的Docker Desktop调整到其他盘符,由于新版本已经不让修改软连接了,只好另谋策略,最终还是改成功了。 出现问题 使用软连接修改 上面代码我们可以科幻的理解一下 幻想破灭 //TODO 用户点击执行安装 if(检查文件夹是否软连接){有则&a…

虚拟机中Ubuntu 22上传框被黑框包裹的解决方法

虚拟机中Ubuntu 22上传框被黑框包裹的解决方法 现象解决方法 现象 在vm17下的ubuntu22使用上传表单时出现了这种不和谐的现象,被领导批评一通。最后费劲心思,找到了这个问题的解决方法。 解决方法 解决方法特别容易,在虚拟机的设置中&…

模型实战(13)之YOLOv8实现手语字母检测与识别+权重分享

YOLOv8实现手语字母检测与识别+权重分享 本文借助yolov8 实现手语字母的检测与识别:先检测手的ROI,进而对手语表达的字母含义进行识别全文将从环境搭建、模型训练及预测来展开对整个算法流程进行讲解文中给出了开源数据集链接及从 Roboflow 上的下载教程实现效果如下: 1. 环…

信驰达推出基于CC2340的BLE PEPS解决方案

近日,TI发布了第四代低功耗蓝牙SoC-CC2340,该产品凝聚了TI 公司20多年的射频经验,在成本、尺寸和性能上做了优化设计,是目前市场上最有价值的低功耗蓝牙SoC之一。 TI CC2340 SoC采用48 MHz ARM Cortex-M0 MCU,高达512…

LLM 应用参考架构:ArchGuard Co-mate 实践示例

随着,对于 LLM 应用于架构领域探索的进一步深入,以及 ArchGuard Co-mate 开发进入深入区,我们发现越来越多的通用模式。 在先前的文章里,我们总结了一系列的设计原则,在这篇文章里,我们将介绍 ArchGuard Co…

MATLAB 之 数值积分和离散傅里叶变换

这里写目录标题 一、数值积分1. 数值积分基本原理2. 数值积分的实现2.1 变步长辛普森法2.2 自适应积分法2.3 高斯——克朗罗德法2.4 梯形积分法2.5 累计梯形积分 3. 多重定积分的数值求解 二、离散傅里叶变换1. 离散傅里叶变换算法简介2. 离散傅里叶变换的实现 一、数值积分 数…

死信是什么,如何运用RabbitMQ的死信机制?

系列文章目录 手把手教你,本地RabbitMQ服务搭建(windows) 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉? RabbitMQ 消费模式该如何选择 死信是什么,如何运用Rabbit…

SVN 多项目地址指向方法

前言 我们在实际的开发中往往可能管理着多个项目,多个项目都用SVN管理着,如果遇到SVN地址变更,以前我们需要对每个项目一一进行SVN重新定位,项目少还好,一旦项目很多并且SVN地址经常变的情况下,进行地址映…

IntelliJ IDEA maven 引用本地 jar 文件

一、背景说明 由于某些特定原因,不能在远程maven仓库中下载所需要版本的jar文件,需要在maven中引用本地jar文件。 二、解决方案 1、创建 libs 目录 为了方便jar包管理,可以在工程目录下,创建一个与src目录平级的libs目录。如下…

Hologres弹性计算在OLAP分析上的实践和探索

作者:王奇 阿里云Hologres研发 简介: 1、本文介绍了OLAP分析在大数据分析中的位置 2、分析并介绍目前大数据OLAP遇到的分析性能、资源隔离、高可用、弹性扩缩容等核心问题 3、解析阿里云Hologres是如何解决极致性能、弹性、业务永续、性价比等核心刚需的…

.maloxx勒索病毒数据怎么处理|数据解密恢复,malox/mallox

导语: 随着科技的快速发展,数据成为了企业和个人不可或缺的财富。然而,网络安全威胁也日益增多,其中Mallox勒索病毒家族的最新变种.maloxx勒索病毒的出现给我们带来了巨大的困扰。但不要担心!91数据恢复研究院将为您揭…

截断文件:truncate()和ftruncate()系统调用和LFS验证

简介 truncate()和ftruncate()系统调用将文件大小设置为length参数指定的值。 NAMEtruncate, ftruncate - truncate a file to a specified lengthSYNOPSIS#include <unistd.h>#include <sys/types.h>int truncate(const char *path, off_t length);int ftruncat…

Java面试题【1】

Java面试题——Java部分 文章目录 Java面试题——Java部分选择题1.下面sum的值是&#xff08; D &#xff09;2.下面程序的运行结果&#xff08; A &#xff09;3.若x是float类型变量&#xff0c;x10/4; 则x的值是&#xff08; B &#xff09;4.以下程序的输出结果是&#xff0…

HTML系列

快捷键 表格快捷键&#xff1a;table>trn>tdn{a}&#xff08;n行n列&#xff0c;内容均为a&#xff09;无序列表快捷键&#xff1a;ul>li*n&#xff08;n代表无序列表的数量&#xff09; 对应表格快捷产出的样式&#xff08;不用管table内的参数设置&#xff0c;这里…

用UDP套接字实现客户端和服务端通信

IP地址和port端口号 IP地址 数据有IP(公网)标识一台唯一的主机。 port端口号 为了更好的标识一台主机上服务进程的唯一性&#xff0c;我们采用端口号port&#xff0c;标识服务器进程&#xff0c;客户端进程的唯一性&#xff01; ip端口号 IP地址(主机全网唯一性) 该主机上的端…

Redis7【⑦ Redis哨兵(sentinel)】

Redis哨兵 Redis Sentinel&#xff08;哨兵&#xff09;是 Redis 的高可用性解决方案之一&#xff0c;它可以用于监控和管理 Redis 主从复制集群&#xff0c;并在主节点发生故障时自动将从节点升级为新的主节点&#xff0c;从而保证系统的高可用性和可靠性。 Redis Sentinel …