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标志,电源管理器可以在 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 枚举值。 有关详细信息,请参阅 系统电源操作

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

下表显示了IRP_MN_SET_POWER的内容。Parameters.Power。{State|ShutdownType} 以及每个系统电源转换SYSTEM_POWER_STATE_CONTEXT结构中的CurrentSystemStateTargetSystemStateEffectiveSystemState 位字段。 每行表示一个 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
...Wake/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,以指示设备已进入请求的状态。

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

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

Operation

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

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

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

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

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

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

每个驱动程序都必须通过从 Windows Vista) 或 PoCallDriver (Windows Server 2003、Windows XP 和 Windows 2000) 开始调用 IoCallDriver (,将每个电源 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。

在 Windows 2000 及更高版本的操作系统上, ShutdownType 的值也可以是 PowerActionShutdown。 在这种情况下,驱动程序无法判断请求的关机类型,因此应继续进行重置。

设备电源状态

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

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

当 IRP 请求转换为较低功率状态时,驱动程序必须在 IRP 沿着设备堆栈向下移动时处理 IRP,从而保存驱动程序将设备还原到工作状态所需的任何上下文。 在总线驱动程序收到 IRP 后,驱动程序会:

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

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

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

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

  • 完成设备电源 IRP。

驱动程序必须及时完成此 IRP。 通常,驱动程序应避免典型用户发现速度明显缓慢的任何延迟。 例如,驱动程序可能会延迟系统状态更改以刷新缓存的磁盘或网络数据,但不应使网络连接保持活动状态或格式化磁带。 有关详细信息,请参阅 传递电源 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 到达总线驱动程序时,该驱动程序向设备应用 (或重置) 电源,仅) 调用 Windows Server 2003、Windows XP 和 Windows 2000 (PoStartNextPowerIrp ,并调用 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

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT