IRP_MN_SET_POWER

此 IRP 通知驱动程序更改系统电源状态或设置设备的设备电源状态。

主要代码

IRP_MJ_POWER

发送时间

系统电源管理器或设备电源策略所有者都可以发送此 IRP。

电源管理器发送此 IRP 以通知驱动程序更改系统电源状态。 如果驱动程序已注册其设备进行空闲检测,电源管理器会发送此 IRP 来更改空闲设备的电源状态。

拥有电源策略的驱动程序发送此 IRP 来为其设备设置设备电源状态。 驱动程序必须调用 PoRequestPowerIrp 才能发送此 IRP。

电源管理器将此 IRP 发送到 IRQL = PASSIVE_LEVEL到在 PDO 中设置DO_POWER_PAGABLE标志的设备堆栈。 此类堆栈中的驱动程序可以触摸分页代码或数据来完成请求。

如果设置了DO_POWER_INRUSH标志,Power Manager 可以在 IRQL = DISPATCH_LEVEL 发送 IRP。 此类驱动程序不能直接或间接访问任何分页代码或数据。

输入参数

Parameters.Power.Type 成员指定正在设置的电源状态的类型,即 SystemPowerStateDevicePowerState

Parameters.Power.State 成员指定电源状态本身,如下所示:

  • 如果 Parameters.Power.TypeSystemPowerState,则该值是 SYSTEM_POWER_STATE 类型的枚举器。

  • 如果 Parameters.Power.TypeDevicePowerState,则该值是 DEVICE_POWER_STATE 类型的枚举数。

Parameters.Power.ShutdownType 成员指定有关所请求转换的其他信息。 此成员的可能值为 POWER_ACTION 枚举值。 有关详细信息,请参阅 系统 Power Actions

从 Windows Vista 开始, Parameters.Power.SystemPowerStateContext 成员是只读的、部分不透明的 SYSTEM_POWER_STATE_CONTEXT 结构,其中包含有关计算机以前的系统电源状态的信息。 如果 Parameters.Power.TypeSystemPowerState,Parameters.Power.StatePowerSystemWorking,则此结构中的两个标志位指示快速启动还是休眠唤醒导致计算机进入 S0(工作)系统状态。 有关详细信息,请参阅 区分快速启动与休眠唤醒。

下表显示了IRP_MN_SET_POWER的内容。Parameters.Power。{State|ShutdownType} 和每个系统电源转换SYSTEM_POWER_STATE_CONTEXT结构中的 CurrentSystemStateTargetSystemState 和 EffectiveSystemState 位字段。 每行表示一个 IRP_MN_SET_POWER

过渡 国家 关闭类型 当前 SystemState 目标 SystemState Effective SystemState 注释
睡到... S3 睡眠 S0 S3 S3
...唤醒 S0 睡眠 S3 S0 S0
混合睡眠到... S4 休眠 S0 S3 S4 使用休眠文件睡眠 (快速 S4)
...唤醒 S0 睡眠 S3 S0 S0
...唤醒/PwrLost S0 睡眠 S4 S0 S0
休眠到... S4 休眠 S0 S4 S4
...唤醒 S0 睡眠 S4 S0 S0
混合关闭到... S4 休眠 S0 S5 S4 应用已关闭,用户注销,就像关闭一样(休眠启动)
...快速启动 S0 睡眠 S4 S0 S0
关闭到... S5 关闭/重置/关闭 S0 S5 S5
...系统启动 没有用于启动的 S-IRP

输出参数

Parameters.Power.SystemContext 保留供系统使用。

I/O 状态块

驱动程序将 Irp-IoStatus.Status> 设置为STATUS_SUCCESS,以指示设备已进入请求状态。

驱动程序不得失败请求来设置系统电源状态。

位于总线驱动程序上方的函数和筛选器驱动程序不得失败请求来设置设备电源状态。 如果设备已删除或正在删除,则总线驱动程序可能会失败设备电源请求。

操作

电源管理器或驱动程序可以请求 IRP_MN_SET_POWER IRP。 电源管理器出于以下原因之一发送此 IRP:

  • 通知驱动程序更改系统电源状态

  • 更改电源管理器正在对其执行空闲检测的设备电源状态

  • 在驱动程序未能IRP_MN_QUERY_POWER系统电源 状态请求后 重申当前系统状态。 有关详细信息,请参阅 IRP_MN_QUERY_POWER

拥有设备电源策略的驱动程序发送 IRP_MN_SET_POWER 以更改其设备的电源状态。

在任何给定时间,系统只允许每个设备对象的一个此类 IRP 处于活动状态。

每个驱动程序必须通过调用 IoCallDriver (从 Windows Vista 开始)或 PoCallDriver (Windows Server 2003、Windows XP 和 Windows 2000)将每个电源 IRP 向下传递到下一个较低的驱动程序。 PoCallDriver 接口类似于 IoCallDriver 接口,只是电源管理子系统可能会在将 IRP 传递给下一个驱动程序之前延迟 IRP。 例如,如果设备需要直升电流,则 PowerDeviceD0 请求上可能会发生延迟,因此必须使用其他此类设备串行启动。

驱动程序在 Windows Server 2003、Windows XP 或 Windows 2000 上收到IRP_MN_SET_POWER请求后,驱动程序必须调用 PoStartNextPowerIrp,如调用 PoStartNextPowerIrp 中所述。 从 Windows Vista 开始,不需要调用 PoStartNextPowerIrp ,此类调用不会执行电源管理作。

系统电源状态的IRP_MN_SET_POWER

只有系统电源管理器才能发送系统集电源 IRP。

驱动程序不得失败请求来设置系统电源状态。

尽可能,电源 管理器会在发送 IRP_MN_SET_POWER以请求系统睡眠状态之前发送 IRP_MN_QUERY_POWER 。 但是,在某些条件下(如用户按 机按钮或电池过期),电源管理器可能会在不首先查询的情况下发出 IRP_MN_SET_POWER 。 电源管理器仅查询睡眠状态;在启动之前,它永远不会查询。

IRP_MN_SET_POWER请求将发送到设备设备堆栈中的顶部驱动程序。 顶部驱动程序将 IRP 向下传递到下一个下级驱动程序,依此类推,直到 IRP 到达总线驱动程序,这必须完成 IRP。

筛选器驱动程序通常不需要对系统集电源 IRP 执行作,而不是传递它。

但是,设备电源策略所有者在传递 IRP 之前设置 IoCompletion 例程。 在 IoCompletion 例程中,它会为设备电源 IRP 发送 IRP_MN_SET_POWER 请求。 有关详细信息,请参阅 在设备电源策略所有者中处理系统 Set-Power IRP

系统集电源 IRP 通知驱动程序系统电源状态的更改即将发生,并且驱动程序必须为此做好准备。 但是,在驱动程序收到设备电源状态 的IRP_MN_SET_POWER 之前,驱动程序不应更改其 设备的 电源状态。

Parameters.Power.ShutdownType 上的值提供有关挂起作的其他信息。 当 IRP 指定 PowerSystemShutdown (S5)时,驱动程序可以确定系统是否正在重置(PowerActionShutdownReset)或无限期关闭电源以稍后重新启动(PowerActionShutdownOff)。 对于大多数设备的驱动程序,差异不一样。 但是,对于某些设备(如视频流式处理设备),驱动程序可能会关闭设备,以便在系统重置时停止 I/O。

ShutdownType 中的值也可以是 PowerActionShutdown。 在这种情况下,驱动程序无法判断请求的关闭类型,因此应继续重置。

设备电源状态

位于总线驱动程序上方的函数和筛选器驱动程序不得失败请求来设置设备电源状态。 如果设备已删除或正在删除,则总线驱动程序可能会失败设备电源请求。

驱动程序必须在完成 IRP 之前将设备设置为请求的状态。

当 IRP 请求转换到较低电源状态时,驱动程序必须在设备堆栈向下传输时处理 IRP,从而保存驱动程序需要将设备还原到工作状态的任何上下文。 在总线驱动程序收到 IRP 后,驱动程序:

  • 保存驱动程序需要将设备还原到工作状态的任何上下文。

  • 将设备设置为请求的电源状态。

  • 调用 PoSetPowerState 以通知电源管理器。

  • 调用 PoStartNextPowerIrp 以启动下一个电源 IRP(仅限 Windows Server 2003、Windows XP 和 Windows 2000)。

  • 完成设备电源 IRP。

驱动程序必须及时完成此 IRP。 通常,驱动程序应避免典型用户发现明显缓慢的任何延迟。 例如,驱动程序可能会延迟系统状态更改以刷新缓存的磁盘或网络数据,但不应使网络连接保持活动状态或格式化磁带。 有关详细信息,请参阅 传递 Power IRP

在 Windows 2000 及更高版本的作系统上,如果 IRP 指定 PowerDeviceD1PowerDeviceD2PowerDeviceD3,并且系统集电源 IRP 处于活动状态, 则 Parameters.Power.ShutdownType 中的值提供有关系统 IRP 的信息。

休眠路径上的设备的驱动程序应检查此值。 如果 IRP 请求 PowerDeviceD3ShutdownTypePowerActionHibernate,则此类驱动程序应保存还原设备所需的任何上下文,但不应关闭设备;当计算机断电时,设备将进入 D3 状态。

在 Windows 2000 及更高版本的作系统上,如果请求的电源状态为 PowerDeviceD0,驱动程序不应依赖 ShutdownType 上的值。

在 Windows 98/Me 上,如果 IRP 请求设备电源状态, ShutdownType 始终为 PowerActionNone

确定何时关闭设备的驱动程序因设备类而异。

确定何时启动设备的驱动程序几乎始终是访问设备注册的驱动程序。 驱动程序必须验证设备是否处于 D0 状态,然后才能访问设备的硬件寄存器。 如果设备未处于 D0 状态,驱动程序必须调用 PoRequestPowerIrp 来发送 IRP 来启动设备。 除非设备处于 D0 状态,否则驱动程序无法访问其设备。

当驱动程序收到设备状态 D0 的集电源 IRP 时,它会设置 IoCompletion 例程,并将 IRP 传递给下一个下一个较低驱动程序。

当 IRP 到达总线驱动程序时,该驱动程序将(或重置)电源应用于设备,仅调用 PoStartNextPowerIrp (Windows Server 2003、Windows XP 和 Windows 2000),并调用 PoSetPowerState 以通知设备的新电源状态。

在总线驱动程序完成电源 IRP 后,函数和筛选器驱动程序在传输设备堆栈时处理 其 IoCompletion 例程中的 IRP。 在 IoCompletion 例程中,每个驱动程序还原或重新初始化其设备上下文,并执行任何其他必需的启动任务。

有关详细信息,请参阅 处理设备电源状态的IRP_MN_SET_POWER

要求

页眉: Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另请参阅

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT