处理系统电源状态的 IRP_MN_SET_POWER
电源管理器发送电源 IRP,指定 次要代码IRP_MN_SET_POWER 和系统电源状态,原因如下:
更改系统电源状态。
在请求失败后重申当前权力状态 IRP_MN_QUERY_POWER 。
通过 I/O 管理器,电源管理器将 IRP 发送到每个 PnP 设备节点的设备堆栈中的顶部驱动程序。 IRP 通知堆栈中的所有驱动程序的正确系统电源状态。
为了确保有序启动,电源管理器对系统启动 IRP 进行排序,以便父设备有机会在子设备启动之前启动。 在发送系统启动 IRP 之前,电源管理器不会进行查询。
同样,为了确保计算机有条不紊地睡眠或关闭,电源管理器发送系统 IRP,以定义的顺序指定睡眠、休眠或关闭,以便设备在离根更远的设备关闭之前关闭根。 只要有可能,电源管理器在发送此类 IRP 之前进行查询。 有关详细信息,请参阅 处理系统电源状态IRP_MN_QUERY_POWER。
系统电源 IRP 不是更改电源状态的直接请求, 它是一个通知。 驱动程序不得更改其设备的电源状态作为对 系统 电源 IRP 的直接响应;驱动程序仅为了响应设备电源 IRP 而更改 其设备的 电源状态。 (设备电源策略所有者发送设备电源 IRP;请参阅 处理设备电源策略所有者中的系统Set-Power IRP。)
即使设备已处于对请求的系统电源状态有效的设备电源状态,但每个驱动程序都必须将系统设置电源 IRP 传递给下一个较低的驱动程序,直到它到达总线驱动程序。 仅允许总线驱动程序完成此 IRP。
驱动程序如何处理此 IRP 取决于它在设备堆栈中的角色,如以下部分所述:
驱动程序无法通过 IRP_MN_SET_POWER 请求来设置系统电源状态。 电源管理器将忽略为此 IRP 返回的任何故障状态。