处理系统电源状态的 IRP_MN_QUERY_POWER

电源管理器发送一个电源 IRP,其中包含 Parameters.Power.Type 中的次要 IRP 代码IRP_MN_QUERY_POWERSystemPowerState,以确定它是否可以安全地更改为指定的系统电源状态 (S1-S5) ,并允许驱动程序为此类更改做好准备。

只要有可能,电源管理器在发送请求较低 (低功率 ) 状态的IRP_MN_SET_POWER之前进行查询。 但是,如果电池出现故障或即将断电,电源管理器会发送设置电源 IRP,而无需先查询。 在发送 IRP 以将系统设置为工作状态 (S0) 之前,电源管理器永远不会发送查询。

有关设备的电源策略所有者如何处理系统查询电源请求的信息,请参阅 在设备电源策略所有者中处理系统Query-Power IRP

有关不是设备电源策略所有者的驱动程序 () 如何处理系统查询电源请求的信息,请参阅以下内容:

处理筛选器或函数驱动程序中的系统 Query-Power IRP

使筛选器或函数驱动程序中的系统 Query-Power IRP 失败

处理总线驱动程序中的系统 Query-Power IRP

请注意,驱动程序不得发送设备 IRP_MN_SET_POWER 请求以响应系统查询;它仅在收到系统设置电源请求后才请求此类 IRP。

由于电源管理器将系统查询 IRP 发送到系统上的每个设备堆栈,因此,一个设备的驱动程序可能会使查询失败,而其他设备的驱动程序成功完成查询。 从 Windows Vista 开始,将系统电源状态更改为睡眠状态是关键的电源状态更改。 即使驱动程序无法通过系统查询电源 IRP,Windows Vista 中的电源管理器仍可能将系统电源状态更改为睡眠状态。 在查询处于活动状态时,电池也可能过期,因此需要立即关闭。 因此,在查询 IRP 之后,驱动程序必须准备好接收以下任何电源 IRP:

  • 查询状态的IRP_MN_SET_POWER

  • 对不同电源状态的IRP_MN_SET_POWER

  • 当前电源状态的IRP_MN_SET_POWER

  • 对任何状态的IRP_MN_QUERY_POWER

但是,驱动程序通常会在系统查询 IRP 后收到系统设置电源 IRP。 无论如何,即使驱动程序未能通过查询电源 IRP,驱动程序也必须准备好更改系统电源状态。