标准驱动程序例程简介
每个内核模式驱动程序都是围绕一组系统定义的标准驱动程序例程构造的。 内核模式驱动程序通过调用系统提供的驱动程序支持例程处理在这些标准例程中) I/O 请求数据包 (I/O 请求数据包。
所有驱动程序,无论它们在附加驱动程序链中的级别如何,都必须具有一组基本的标准例程才能处理 IRP。 驱动程序是否必须实现其他标准例程取决于驱动程序是控制物理设备还是分层在物理设备驱动程序上,以及基础物理设备的性质。 控制物理设备的最低级别驱动程序比更高级别的驱动程序具有更多的所需例程,后者通常将 IRP 传递给较低级别的驱动程序进行处理。
标准驱动程序例程可以分为两组:每个内核模式驱动程序必须具有的和可选的,具体取决于 驱动程序类型和设备堆栈中的位置。
下表列出了所需的标准例程。
所需的标准驱动程序例程 | 用途 | 描述的位置 |
---|---|---|
DriverEntry | 初始化驱动程序及其驱动程序对象。 | 编写 DriverEntry 例程 |
AddDevice | 初始化设备并创建设备对象。 | 编写 AddDevice 例程 |
Dispatch 例程 | 接收和处理 IRP。 | 编写 Dispatch 例程 |
卸载 | 释放驱动程序获取的系统资源。 | 编写 Unload 例程 |
下表列出了多个可选例程。
可选的标准驱动程序例程 | 用途 | 描述的位置 |
---|---|---|
重新初始化 | 如果 DriverEntry 无法完成驱动程序初始化。 | 编写 Reinitialize 例程 |
StartIo | 在物理设备上启动 I/O 操作。 | 编写 StartIo 例程 |
中断服务例程 | 在设备中断时保存设备的状态。 | 编写 ISR |
延迟过程调用 | 在 ISR 保存设备状态后完成设备中断的处理。 | DPC 对象和 DPC |
SynchCritSection | 同步对驱动程序数据的访问。 | 使用关键节 |
AdapterControl | 启动 DMA 操作。 | 适配器对象和 DMA |
IoCompletion | 完成驱动程序对 IRP 的处理。 | 完成 IRP |
取消 | 取消驱动程序对 IRP 的处理。 | 取消 IRP |
CustomTimerDpc、 IoTimer | 计时和同步事件。 | 同步技术 |
当前 IRP 和目标设备对象是许多标准例程的输入参数。 每个驱动程序通过其一组标准例程分阶段处理每个 IRP。
按照约定,系统提供的驱动程序在除 DriverEntry 以外的每个标准例程的名称前面附加了一个标识、特定于驱动程序或特定于设备的前缀。 例如,本文档使用“DD”,如 驱动程序对象简介中的插图所示。 遵循此约定可以更轻松地调试和维护驱动程序。