>_ DevTrendszh

语言

首页

语言

板块

前端 后端 移动端 DevOps AI / ML 游戏开发 区块链 嵌入式 安全
C

如何不再害怕蓝屏,开始编写 Windows 驱动程序

曾几何时,编写驱动程序被视为一种类似黑魔法的技艺。你坐在黑暗的房间里,周围堆满了总线规格文档,祈祷着下一次 WinDbg 启动不会以系统死机告终。如今入门门槛已经降低,但对"Ring 0"的恐惧却丝毫未减。如果你曾好奇操作系统如何与"硬件"通信,或者需要编写流量过滤或数据保护等特定软件,那么微软的 Windows-driver-samples 仓库就是你的入口。

这不仅仅是代码集合,而是微软工程师为 Windows 11 维护的官方知识库。它包含数百个示例:从内核模式的简单"Hello World"到蓝牙、NFC 和图形子系统的复杂实现。

为什么普通开发者需要这个

我们大多数人在高级语言中编写代码,不考虑底层发生了什么。但有些任务在用户空间(用户模式)中无法解决。例如,如果你正在创建杀毒软件、磁盘活动监控系统或特定 USB 设备,你将不得不深入到驱动程序层面。

与其猜测如何在内核中正确分配内存或处理中断,不如看看操作系统创建者本身是如何做的。该仓库包含现成的模板,你可以将其作为基础,而不必冒着系统蓝屏崩溃的风险去重新发明轮子。

这个仓库里有什么

这个仓库非常庞大。它有近 18 万个文件,涵盖硬件交互的几乎所有方面。微软将示例分成了几个类别,这样你至少可以在一定程度上浏览它们。

通用 Windows 驱动程序

目前,微软正在推广"一个驱动程序适用于所有设备"的概念。使用此模型编写的代码将在普通桌面、平板电脑和嵌入式系统上运行。该仓库充满了仅使用已批准 API 的示例,这保证了与未来 Windows 11 更新的兼容性。

WDF 框架:KMDF 和 UMDF

如果你记得旧的 WDM(Windows 驱动程序模型),你就知道手动 IRP 数据包管理是一场噩梦。现代驱动程序开发建立在 WDF(Windows 驱动程序框架)之上。

  • KMDF(内核模式驱动程序框架)用于直接处理内存和中断。
  • UMDF(用户模式驱动程序框架)允许你编写在普通用户进程中运行的驱动程序。如果这样的驱动程序崩溃,系统会继续运行。该仓库为这两种情况都有很好的示例。

特定技术的示例

在这里你可以找到所有东西的实现:从光传感器和加速度计到复杂的网络过滤器和音频引擎。USB 和蓝牙的工作示例特别有用,因为这些协议绝非易事。

如何在实践中使用这个

要开始,你不能只是下载仓库并点击"构建"。你需要安装 Visual Studio 2022 和 WDK(Windows 驱动程序工具包)。微软已将驱动程序开发工具直接集成到 IDE 中,因此构建过程现在与编译普通 C++ 控制台应用程序几乎没有区别。

以下是一个基于 KMDF 的最小驱动程序示例。在仓库中你会找到一个详细实现 DriverEntry — 一切开始的入口点:

NTSTATUS
DriverEntry(
    _In_ PDRIVER_OBJECT  DriverObject,
    _In_ PUNICODE_STRING RegistryPath
    )
{
    WDF_DRIVER_CONFIG config;
    NTSTATUS status;

    // Инициализация структуры конфигурации
    WDF_DRIVER_CONFIG_INIT(&config, EvtDeviceAdd);

    // Создание объекта драйвера
    status = WdfDriverCreate(DriverObject,
                             RegistryPath,
                             WDF_NO_OBJECT_ATTRIBUTES,
                             &config,
                             WDF_NO_HANDLE);
    return status;
}

有趣的是,该仓库甚至包含使用 GitHub Actions 进行自动化驱动程序构建的说明。如果你想要为你的底层项目设置 CI/CD,这很方便。

需要注意什么

重要的一点:你不能只是从这些示例中复制代码并将其投放到生产环境。微软在文档"从示例代码到生产驱动程序"中特别强调了这一点。你需要:

  1. 为你的设备生成新的 GUID。
  2. 仔细检查错误处理(在示例中,为了清晰起见,错误处理通常被简化了)。
  3. 配置数字签名,否则 Windows 将直接拒绝加载你的二进制文件。

顺便说一句,如果你只是刚开始,我建议首先查看 UMDF 驱动程序文件夹。它更安全。你将能够像调试普通应用程序一样调试代码,而不必担心一个指针错误会导致你的电脑重启。

谁应该学习这个仓库

首先是系统程序员和从事嵌入式系统工作的人。但即使你从事应用软件工作,了解文件系统或网络驱动程序的构建方式也会大大拓宽你的视野。你会开始理解为什么某些 I/O 操作会以某种方式运行。

这个仓库是活跃的,定期有提交,star 数量(近 8 千)表明尽管有各种尝试将我们从"硬件"中抽象出来,驱动程序开发仍然相关。如果你缺少高质量的 C 系统编程示例,你已经找到了它们。

相关项目