如果你已经写过最简单的 WDM 驱动,能加载、能卸载、能在 DebugView 里打几行日志,那么真正的麻烦往往从这里开始:设备一插一拔系统就蓝屏,电源状态一变驱动就挂,两个驱动抢同一个设备不知道谁先收到 IRP。这门《Windows驱动编程基础(下)》处理的正是这些问题——它不讲怎么写出第一个驱动,而是讲驱动进入真实系统之后要遵守的那些规则。

先确认你缺的是哪一块

上半部分通常解决的是「驱动怎么写出来」:驱动对象、设备对象、IRP 的基本派发。但真实硬件不会安安静静待着。它会被热插拔,会被系统要求休眠,会挂在一条 PCI 总线上,会被上层驱动和下层驱动夹在中间。这一部分要补的,就是这四类缺口:

  • 分层与过滤:知道驱动栈是怎么叠起来的,谁在谁的上面,IRP 如何一层层往下传、又如何带着结果返回。
  • PNP 管理:设备到达、移除、意外拔出时,驱动该按什么顺序响应,哪些事必须做、哪些事不能做。
  • 总线与 PCI:设备为什么能被枚举出来,配置空间里那些寄存器到底在描述什么。
  • 电源管理:系统睡眠、唤醒时,驱动收到的电源 IRP 序列长什么样。

这四块彼此不独立。过滤驱动要正确处理 PNP,前提是理解它在栈里的位置;总线驱动要枚举子设备,前提是理解 PNP 的分发逻辑。所以这门课的顺序不是随便排的。

过滤驱动:最容易上手,也最容易埋雷

过滤驱动是很多人接触内核的第一个「实用」方向——不改原驱动,在上层或下层插一层,做监控、做拦截、做数据转换。看起来简单,难点在于你必须清楚自己插在了哪里、看到了什么、该不该把请求继续往下发。课程会围绕过滤驱动的附加与分离、IRP 的转发与完成这几件事展开,重点不在 API 怎么写,而在于判断「这个请求我能不能拦、拦了之后谁负责收尾」。

PNP 与电源:状态机式的思维训练

PNP 和电源管理本质上都是状态迁移。设备从「未启动」到「已启动」,从「工作」到「低功耗」,中间要经过哪些 IRP,每个 IRP 到达时驱动允许做什么、不允许做什么,都有限定。学这部分最容易犯的错,是把它当成一堆孤立的处理函数去背。更有效的做法是把它们当成一条时间线:设备插入会发生什么,拔掉会发生什么,休眠再唤醒又会发生什么。课程把这些序列拆开讲,你在写代码之前应该能先在纸上把这几个场景画出来。

总线驱动和 PCI:看清设备是怎么被发现的

很多人对 PCI 的认识停留在「一根插槽」,但真正要写总线相关代码时,需要理解配置空间、BAR、枚举过程,以及总线驱动如何为自己的子设备创建 PDO。这部分内容偏硬件,但它是理解 PNP 的前提——不知道设备从哪来,就说不清 PNP 请求从哪来。学完这里,你对「设备树」这个概念应该不再只是一个名词。

看完应能回答的问题

  • 你的过滤驱动附加在设备栈的哪一层,决定了它能看见哪些 IRP?
  • 设备被意外拔出时,驱动收到的 IRP 顺序和正常移除有什么不同?
  • 系统进入睡眠前,电源 IRP 是按什么顺序下发的,哪个环节最容易出错?
  • PCI 设备的配置空间在枚举过程中被谁读写,总线驱动在其中扮演什么角色?
  • 一个分层驱动栈中,谁负责完成 IRP,谁负责把它继续往下传?

如果这些问题你现在只能答出一半,那这门课正好补的就是另一半。建议边看边对着自己的驱动代码验证:栈位置、IRP 流向、电源状态迁移,这三件事能不能在自己的工程里说清楚。说不清的地方,就是接下来要重点看的地方。

Windows驱动编程基础(下)

课程详情

课程标题:Windows驱动编程基础(下)

本课程深入讲解Windows驱动编程的核心内容,包括分层驱动、过滤驱动、PNP管理、总线驱动原理及其实现,旨在帮助学员全面掌握Windows内核编程技术。

适合人群

  • 希望学习Windows内核编程技术的学员
  • 熟悉C/C++编程
  • 熟悉Windows系统
  • 熟悉Windows系统编程

学习收获

  • 了解Windows驱动的分层管理
  • 掌握计算机主要总线PCI总线的工作原理
  • 熟悉WDM类型驱动的PNP管理机制
  • 理解Windows操作系统的电源管理
  • 学习过滤驱动的应用
  • 深入理解总线驱动

课程亮点

  • 全面讲解Windows驱动编程的核心概念
  • 理论与实践相结合,提升学员实际操作能力
  • 深入浅出,适合不同基础水平的学员

课程目录

01 DeviceIoControl和一个完成的NT驱动
  01 从DeviceIoControl说起.mp4
  02 控制码通信.mp4
  03 内存的使用.mp4
  04 端口的读写和PC喇叭的驱动.mp4
  05 在内核执行应用层代码.mp4
02 分层驱动
  01 分层驱动与键盘过滤.mp4
  02 IoMarkIrpPending.mp4
  03 列举设备栈.mp4
  04 系统调用.mp4
  05 查找SSDT以及系统调用.mp4
  06 第二种查找SSDT的方法.mp4
  07 更强的WriteProcessMemory.mp4
03 PCI
  01 PCI配置空间背景.mp4
  02 PCI配置地址空间.mp4
  03 列举PCI设备.mp4
04 Pnp
  01 即插即用概述.mp4
  02 设备接口.mp4
  03 驱动安装过程详解一.mp4
  04 驱动安装过程详解二.mp4
  05 Filter_Resource.mp4
  06 Start_device.mp4
  07 资源使用.mp4
  08 获得物理设备对象和总线信息.mp4
  09 确保驱动不被卸载.mp4
05 电源管理
  01 电源管理.mp4
  02 电源状态的上升和下降.mp4
  03 电源管理优化.mp4
06 过滤驱动
  01 过滤驱动框架.mp4
  02 过滤驱动的概念和安装.mp4
07 多功能设备驱动-类似总线驱动
  01 IRP处理总结.mp4
  02 物理设备对象的创建.mp4
  03 总线设备安装结果略看.mp4
  04 总线驱动处理PDO的IRP.mp4