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

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

引言

对于 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 版本 1903 Visual Studio Community 2019Visual Studio Professional 2019Visual Studio Enterprise 2019
Windows 10 版本 1809、Windows 10 版本 1803、Windows 10 版本 1709 Visual Studio Community 2017Visual Studio Professional 2017Visual Studio Enterprise 2017
Windows 10 版本 1703、Windows 10 版本 1607 Visual Studio Express 2015 桌面版Visual Studio Community 2015Visual Studio Professional 2015Visual Studio Enterprise 2015
Windows 8.1 更新、Windows 8.1 Visual Studio 2013
Windows 8 Visual Studio Professional 2012Visual 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 版本 21H2 Windows 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 7 WDK 7.1.0
Windows 8 WDK 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

相关文章
|
1月前
|
监控 Windows
Windows系统中Wireshark抓包工具的安装使用
Windows系统中Wireshark抓包工具的安装使用
|
1月前
|
编译器 C语言 流计算
在Windows系统中创建C语言开发环境
【2月更文挑战第22天】在Windows系统中创建C语言开发环境
21 6
|
3月前
|
Oracle Java 关系型数据库
【开发环境】Windows环境下JDK安装&环境变量配置(无错完整)
【1月更文挑战第20天】【开发环境】Windows环境下JDK安装&环境变量配置(无错完整)
|
4月前
|
Python Windows
Windows系统上配置Python开发环境
Python安装程序 首先,您需要从Python官方网站(https://www.python.org/downloads/)下载Python的最新稳定版本。在页面上选择适用于Windows的安装程序。 运行安装程序 下载完成后,双击下载的安装程序(通常是一个.exe文件),然后按照安装向导的指示进行操作。请确保在安装过程中勾选“Add Python to PATH”选项,这将使您能够在命令行中轻松访问Python。
47 1
|
4月前
|
监控 安全 API
5.9 Windows驱动开发:内核InlineHook挂钩技术
在上一章`《内核LDE64引擎计算汇编长度》`中,`LyShark`教大家如何通过`LDE64`引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的`InlineHook`函数挂钩其实与应用层一致,都是使用`劫持执行流`并跳转到我们自己的函数上来做处理,唯一的不同的是内核`Hook`只针对`内核API`函数,但由于其身处在`最底层`所以一旦被挂钩其整个应用层都将会受到影响,这就直接决定了在内核层挂钩的效果是应用层无法比拟的,对于安全从业者来说学会使用内核挂钩也是很重要。
40 1
5.9 Windows驱动开发:内核InlineHook挂钩技术
|
4月前
|
监控 API C++
8.4 Windows驱动开发:文件微过滤驱动入门
MiniFilter 微过滤驱动是相对于`SFilter`传统过滤驱动而言的,传统文件过滤驱动相对来说较为复杂,且接口不清晰并不符合快速开发的需求,为了解决复杂的开发问题,微过滤驱动就此诞生,微过滤驱动在编写时更简单,多数`IRP`操作都由过滤管理器`(FilterManager或Fltmgr)`所接管,因为有了兼容层,所以在开发中不需要考虑底层`IRP`如何派发,更无需要考虑兼容性问题,用户只需要编写对应的回调函数处理请求即可,这极大的提高了文件过滤驱动的开发效率。
41 0
|
4月前
|
监控 Windows
7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动
在笔者上一篇文章`《内核监视LoadImage映像回调》`中`LyShark`简单介绍了如何通过`PsSetLoadImageNotifyRoutine`函数注册回调来`监视驱动`模块的加载,注意我这里用的是`监视`而不是`监控`之所以是监视而不是监控那是因为`PsSetLoadImageNotifyRoutine`无法实现参数控制,而如果我们想要控制特定驱动的加载则需要自己做一些事情来实现,如下`LyShark`将解密如何实现屏蔽特定驱动的加载。
32 0
7.4 Windows驱动开发:内核运用LoadImage屏蔽驱动
|
21天前
|
监控 安全 API
7.3 Windows驱动开发:内核监视LoadImage映像回调
在笔者上一篇文章`《内核注册并监控对象回调》`介绍了如何运用`ObRegisterCallbacks`注册`进程与线程`回调,并通过该回调实现了`拦截`指定进行运行的效果,本章`LyShark`将带大家继续探索一个新的回调注册函数,`PsSetLoadImageNotifyRoutine`常用于注册`LoadImage`映像监视,当有模块被系统加载时则可以第一时间获取到加载模块信息,需要注意的是该回调函数内无法进行拦截,如需要拦截则需写入返回指令这部分内容将在下一章进行讲解,本章将主要实现对模块的监视功能。
37 0
7.3 Windows驱动开发:内核监视LoadImage映像回调
|
4月前
|
监控 安全 API
7.2 Windows驱动开发:内核注册并监控对象回调
在笔者上一篇文章`《内核枚举进程与线程ObCall回调》`简单介绍了如何枚举系统中已经存在的`进程与线程`回调,本章`LyShark`将通过对象回调实现对进程线程的`句柄`监控,在内核中提供了`ObRegisterCallbacks`回调,使用这个内核`回调`函数,可注册一个`对象`回调,不过目前该函数`只能`监控进程与线程句柄操作,通过监控进程或线程句柄,可实现保护指定进程线程不被终止的目的。
31 0
7.2 Windows驱动开发:内核注册并监控对象回调
|
4月前
|
监控 安全 API
7.6 Windows驱动开发:内核监控FileObject文件回调
本篇文章与上一篇文章`《内核注册并监控对象回调》`所使用的方式是一样的都是使用`ObRegisterCallbacks`注册回调事件,只不过上一篇博文中`LyShark`将回调结构体`OB_OPERATION_REGISTRATION`中的`ObjectType`填充为了`PsProcessType`和`PsThreadType`格式从而实现监控进程与线程,本章我们需要将该结构填充为`IoFileObjectType`以此来实现对文件的监控,文件过滤驱动不仅仅可以用来监控文件的打开,还可以用它实现对文件的保护,一旦驱动加载则文件是不可被删除和改动的。
29 1
7.6 Windows驱动开发:内核监控FileObject文件回调