处理设备电源策略所有者中的系统 Set-Power IRP

为了响应系统设置电源 IRP,设备堆栈的 电源策略所有者 负责将其设备堆栈置于适当的设备电源状态。

一般情况下,当设备电源策略所有者收到系统电源状态 的IRP_MN_SET_POWER 时,它应通过将系统设置电源 IRP 向下传递到设备堆栈来做出响应。 设备电源策略所有者还应通过发送 IoCompletion 例程中相应设备电源状态的设备堆栈IRP_MN_SET_POWER来做出响应。 堆栈中的所有驱动程序完成设备设置电源 IRP 后,设备电源策略所有者将完成系统设置电源 IRP。

但是,为了提高系统恢复性能,没有子设备的设备的设备电源所有者应使用不同的方法来减少系统从睡眠状态返回到工作状态 S0 所需的时间。 在这种情况下,为了响应将系统返回到工作状态 S0 的系统集电源 IRP,设备电源策略所有者应执行以下操作序列:

  1. 在驱动程序的 DispatchPower 例程中收到 S0 系统电源状态的IRP_MN_SET_POWER IRP 后,为 IRP 设置 IoCompletion 例程,并将 IRP 向下传递堆栈。

  2. 在步骤 (1) 中设置的 IoCompletion 例程中,针对相应的设备电源状态请求 IRP_MN_SET_POWER IRP,然后立即完成系统设置电源 IRP。 驱动程序不应等待设备设置电源 IRP 完成,然后才能完成系统设置电源 IRP。 在所有较低级别的驱动程序完成系统设置电源 IRP,并将系统集电源 IRP 传递回驱动程序的功能设备对象 (FDO) 后,将执行 IoCompletion 例程。

  3. 执行任何所需的特定于设备的初始化。

  4. 完成步骤 2) (发送的设备设置电源 IRP。

  5. 处理设备处于 设备睡眠状态时排队的 I/O 请求。

内核电源管理器具有一组有限的 IRP 调度队列,必须快速通知系统中的所有设备返回到系统工作状态 S0。 无法尽快完成系统设置电源 IRP 的驱动程序会阻止其他设备获取其系统集电源 IRP,这可能会在系统电源状态转换期间对整体系统性能产生不利影响。

有关处理系统集电源 IRP 的更多详细信息,请参阅以下内容:

确定正确的设备电源状态

在系统 Set-Power IRP 响应中发送设备 Set-Power IRP