如何不再害怕蓝屏,开始编写 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,这很方便。
需要注意什么
重要的一点:你不能只是从这些示例中复制代码并将其投放到生产环境。微软在文档"从示例代码到生产驱动程序"中特别强调了这一点。你需要:
- 为你的设备生成新的 GUID。
- 仔细检查错误处理(在示例中,为了清晰起见,错误处理通常被简化了)。
- 配置数字签名,否则 Windows 将直接拒绝加载你的二进制文件。
顺便说一句,如果你只是刚开始,我建议首先查看 UMDF 驱动程序文件夹。它更安全。你将能够像调试普通应用程序一样调试代码,而不必担心一个指针错误会导致你的电脑重启。
谁应该学习这个仓库
首先是系统程序员和从事嵌入式系统工作的人。但即使你从事应用软件工作,了解文件系统或网络驱动程序的构建方式也会大大拓宽你的视野。你会开始理解为什么某些 I/O 操作会以某种方式运行。
这个仓库是活跃的,定期有提交,star 数量(近 8 千)表明尽管有各种尝试将我们从"硬件"中抽象出来,驱动程序开发仍然相关。如果你缺少高质量的 C 系统编程示例,你已经找到了它们。
相关项目