IRP_MN_QUERY_POWER
此 IRP 查询设备以确定是否可以更改系统电源状态或设备电源状态。
主要代码
发送时间
电源管理器或设备电源策略所有者发送此 IRP,以确定它是否可以更改系统或设备电源状态(通常为进入睡眠状态)。 驱动程序必须调用 PoRequestPowerIrp 来分配和发送此 IRP。
电源管理器将此 IRP 在 IRQL = PASSIVE_LEVEL 发送到在 PDO 中设置DO_POWER_PAGABLE标志的设备堆栈。
如果设置了DO_POWER_INRUSH标志,电源管理器可以在 IRQL = DISPATCH_LEVEL 发送 IRP。 此类驱动程序不能直接或间接访问任何分页代码或数据。
输入参数
Parameters.Power.Type 指定要设置的电源状态类型,可以是 SystemPowerState 还是 DevicePowerState。
Parameters.Power.State 指定电源状态本身,如下所示:
如果 Parameters.Power.Type 为 SystemPowerState,则该值是 SYSTEM_POWER_STATE 类型的枚举器。
如果 Parameters.Power.Type 为 DevicePowerState,则该值是 DEVICE_POWER_STATE 类型的枚举器。
Parameters.Power.ShutdownType 指定有关所请求转换的其他信息。 可能的值为 POWER_ACTION 类型的枚举器。
输出参数
无。
I/O 状态块
驱动程序将 Irp-IoStatus.Status> 设置为 STATUS_SUCCESS,以指示设备可以进入请求的状态。 驱动程序设置任何适当的故障状态,以指示它不能进入请求的状态。
Operation
IRP_MN_QUERY_POWER的参数与 IRP_MN_SET_POWER 的参数相同。 但是, IRP_MN_QUERY_POWER 查询系统或设备是否可以进入特定电源状态,而不是通知驱动程序电源状态不可撤销的更改。
驱动程序不得为了响应 IRP_MN_QUERY_POWER 请求而更改其设备的电源状态。
驱动程序在 Windows Server 2003、Windows XP 和 Windows 2000 上收到 IRP_MN_QUERY_POWER 请求后,驱动程序必须调用 PoStartNextPowerIrp,如 调用 PoStartNextPowerIrp 中所述。 从 Windows Vista 开始,不需要调用 PoStartNextPowerIrp ,此类调用不执行电源管理操作。
系统电源状态的IRP_MN_QUERY_POWER
电源管理器发送此 IRP,以确保它可以在不中断工作(例如断开网络连接)的情况下更改系统电源状态。
如果可能,电源管理器在发送 IRP_MN_SET_POWER 之前进行查询,以请求系统睡眠状态或正常系统关闭。 但是,在某些关键条件下 (,例如用户按下 关机 按钮或电池过期) ,电源管理器可能会发送 IRP_MN_SET_POWER 请求,而无需先发送查询电源请求。 电源管理器仅查询睡眠状态;在返回到工作状态之前,它从不查询。
当驱动程序收到系统电源查询 IRP 时,如果它不能支持任何对查询的系统状态有效的设备状态,它应该会使 IRP 失败。 有关详细信息,请参阅 DeviceState。 否则,驱动程序应将 IRP 传递给下一个较低的驱动程序。 总线驱动程序完成 IRP。
从 Windows Vista 开始,过渡到系统睡眠状态被视为关键操作。 尽管驱动程序可能会使系统查询电源 IRP 失败,但电源管理器仍可能将系统电源状态更改为睡眠状态。 驱动程序收到系统查询电源 IRP 后,应始终为系统电源状态的后续更改做好准备。
当设备电源策略所有者收到系统电源查询 IRP 时,它应在 IRP 中设置 IoCompletion 例程,然后再将其传递。 在 IoCompletion 例程中,它应发送对查询的系统状态有效的设备状态的 IRP_MN_QUERY_POWER 。 有关详细信息,请参阅 在设备电源策略所有者中处理系统Query-Power IRP。
当 IRP 指定 PowerSystemShutdown (S5) 时, Parameters.Power.ShutdownType 中的值会提供关闭的原因。 ShutdownType 告知驱动程序系统是 (PowerActionShutdownReset) 重置还是无限期关闭以稍后 (PowerActionShutdownOff) 重新启动。 对于大多数设备的驱动程序,差异是无关紧要的。 但是,对于某些设备(例如执行 DMA 的视频流设备),驱动程序可能会选择在系统重置时关闭其设备,从而停止任何正在进行的 I/O。
在 Microsoft Windows 2000 及更高系统上, ShutdownType 的值也可以是 PowerActionShutdown。 在这种情况下,驱动程序无法判断请求的关机类型,因此应继续进行重置。
如果驱动程序在系统电源状态 IRP_MN_QUERY_POWER 请求失败,电源管理器通常会通过发出 IRP_MN_SET_POWER IRP 来做出响应。 通常,此 IRP 将重申当前系统状态。 但是,驱动程序可能会收到查询状态或其他中间状态 的IRP_MN_SET_POWER 。 驱动程序应准备好处理这些情况。
设备电源状态的IRP_MN_QUERY_POWER
设备电源策略所有者将此 IRP 发送到其堆栈,以响应系统 IRP_MN_QUERY_POWER 请求。
如果驱动程序可以将其设备置于请求的设备状态,则会将 IoStatus.Status 设置为STATUS_SUCCESS并将 IRP 向下传递到下一个较低的驱动程序,依此类推,直到 IRP 到达总线驱动程序。 如果堆栈中的任何驱动程序必须使 IRP 失败,该驱动程序应通过调用 IoCompleteRequest 并返回失败状态立即完成 IRP。 IRP 失败的驱动程序不会在堆栈中进一步传递它。
通过返回STATUS_SUCCESS,驱动程序保证不会启动任何会更改其设置所请求电源状态的能力的操作。 驱动程序应将需要此类操作的任何 IRP 排队,直到完成将设备返回到可接受的电源状态的设置功率 IRP。
在 Windows 2000 及更高系统上,当 IRP 指定 PowerDeviceD1、 PowerDeviceD2 或 PowerDeviceD3 时,如果系统电源 IRP 处于活动状态, Parameters.Power.ShutdownType 中的值将提供有关当前系统电源 IRP 的信息。 在这种情况下, ShutdownType 中的值指示当前请求的系统电源状态;如果系统请求未完成,则为 PowerActionNone 。 在 Windows 98/Me 上,当 IRP 请求设备电源状态时,此字段始终包含 PowerActionNone 。
要求
标头 |
Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h) |