单个设备的电源 IRP
设备电源 IRP 指定主要 IRP 代码IRP_MJ_POWER、下面列出的次要电源 IRP 代码之一,以及 Power.Type 成员中的 DevicePowerState 值。
设备堆栈中的所有驱动程序都接收此类 IRP;通常,只有设备电源策略管理器可以发送这些 IRP。 但是,电源管理器可以在代表设备执行空闲检测时发送设备电源 IRP,如 使用 Power Manager 例程进行空闲检测中所述。
驱动程序出于以下任一原因发送设备电源 IRP:
查询或更改设备电源状态以响应系统电源 IRP
将设备置于睡眠状态以节电
在设备处于睡眠状态后将其返回到工作状态
使设备能够唤醒以响应外部信号
为设备通电时获取电源序列值
下图显示了发送、转发和完成设备电源 IRP 的步骤序列。
如上图所示,设备电源 IRP 在以下步骤中发送、转发和完成:
设备电源策略所有者调用 PoRequestPowerIrp 来分配设备电源 IRP,指定作为 IRP 目标的 PDO 以及 IRP 完成后要调用的回调例程。
电源管理器分配设备电源 IRP,并将其发送到目标 PDO 设备堆栈中的顶部驱动程序。
驱动程序执行以下操作:
设置 IoCompletion 例程(如果需要)。
如果未使用完成例程, (Windows Server 2003、Windows XP 和 Windows 2000) 调用 PoStartNextPowerIrp 。 从 Windows Vista 开始,此调用不是必需的,此类调用不执行电源管理操作。
调用 IoCallDriver (Windows 7 和 Windows Vista) 或调用 PoCallDriver (Windows Server 2003、Windows XP 和 Windows 2000) ,以将 IRP 向下传递到下一个较低的驱动程序。
堆栈中的每个驱动程序都会执行此操作,直到 IRP 到达总线驱动程序。 如果驱动程序必须使 IRP 失败,它应立即执行此操作并调用 IoCompleteRequest。
维护设备 PDO 的总线驱动程序执行请求的操作,然后调用 IoCompleteRequest 来完成 IRP。 如果删除设备或正在删除设备,总线驱动程序可能会使设备启动 IRP 失败。
I/O 管理器调用 IoCompletion 例程,这些例程由驱动程序在将 IRP 向下传递堆栈时设置。 调用所有 IoCompletion 例程后,将运行回调例程。
有关设备电源 IRP 的详细信息,请参阅管理具有Wake-Up功能的单个设备的电源和支持设备。 有关电源序列 IRP 的详细信息,请参阅 IRP_MN_POWER_SEQUENCE。