DispatchPower 例程

驱动程序的 DispatchPower 例程通过处理IRP_MJ_POWER I/O 函数代码的 IRP 支持电源管理。 与 IRP_MJ_POWER 函数代码关联的是电源管理的几个次要 I/O 函数代码。 电源管理器使用这些次要功能代码来指示驱动程序更改电源状态、等待和响应系统唤醒事件,以及查询驱动程序有关其设备的信息。

每个驱动程序的 DispatchPower 例程执行以下任务:

  • 如果可能,请处理 IRP。

  • 使用 PoCallDriver 将 IRP 传递到设备堆栈中的下一个下一个驱动程序。

  • 如果是总线驱动程序,请在设备上执行请求的电源操作并完成 IRP。

设备的所有驱动程序都必须有机会处理设备的电源 IRP,但允许函数或筛选器驱动程序使 IRP 失败的少数情况除外。 大多数函数和筛选器驱动程序要么执行一些处理,要么为每个电源 IRP 设置 IoCompletion 例程,然后将 IRP 向下传递到下一个较低的驱动程序,而不完成它。 最终,IRP 到达总线驱动程序,该驱动程序会根据需要以物理方式更改设备的电源状态并完成 IRP。

IRP 完成后,I/O 管理器会在 IRP 沿着设备堆栈移动时调用驱动程序设置的任何 IoCompletion 例程。 驱动程序是否需要设置完成例程取决于 IRP 的类型和驱动程序的个人要求。

启动设备的电源 IRP 必须先由设备堆栈中最低的驱动程序 (基础总线驱动程序) 处理,然后由堆栈上每个连续的驱动程序进行处理。 关闭设备电源的电源 IRP 必须先由设备堆栈顶部的驱动程序处理,然后由每个连续的驱动程序处理。

可移动设备的特殊处理

在其 DispatchPower 例程中,可移动设备的驱动程序应检查以查看设备是否仍然存在。 如果设备已被移除,驱动程序不应将 IRP 向下传递到下一个较低的驱动程序。 相反,驱动程序应执行以下操作:

  • 调用 PoStartNextPowerIrp 开始处理下一个电源 IRP。

  • Irp-IoStatus.Status> 设置为 STATUS_DELETE_PENDING。

  • 调用 IoCompleteRequest,指定IO_NO_INCREMENT来完成 IRP。

  • 返回STATUS_DELETE_PENDING。