此 IRP 查询设备以确定是否可以更改系统电源状态或设备电源状态。
主要代码
发送时间
电源管理器或设备电源策略所有者发送此 IRP 以确定它是否可以更改系统或设备电源状态,通常进入睡眠状态。 驱动程序必须调用 PoRequestPowerIrp 来分配和发送此 IRP。
电源管理器将此 IRP 发送到 IRQL = PASSIVE_LEVEL到在 PDO 中设置DO_POWER_PAGABLE标志的设备堆栈。
如果设置了DO_POWER_INRUSH标志,Power Manager 可以在 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,以指示设备可以进入请求的状态。 驱动程序设置任何适当的失败状态以指示它无法进入请求的状态。
操作
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 时, Parameters.Power.ShutdownType 上的值提供有关当前系统电源 IRP 的信息(如果系统电源 IRP 处于活动状态)。 在这种情况下, ShutdownType 上的值指示当前请求的系统电源状态;如果系统请求未完成,则 为 PowerActionNone 。 在 Windows 98/Me 上,当 IRP 请求设备电源状态时,此字段始终包含 PowerActionNone 。
要求
页眉: Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)