IRP_MN_SET_POWER

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

主要代码

IRP_MJ_POWER

发送时间

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

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

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

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

如果设置了 DO_POWER_INRUSH 标志,则电源管理器可以将 IRP 发送到 IRQL = DISPATCH_LEVEL。 此类驱动程序不能直接或间接访问任何分页的代码或数据。

输入参数

Parameters. Type成员指定所设置的电源状态的类型( SystemPowerStateDevicePowerState)。

参数. power. state成员指定电源状态本身,如下所示:

ShutdownType成员指定有关所请求转换的其他信息。 此成员的可能值是 POWER_ACTION 枚举值。 有关详细信息,请参阅 系统电源操作

从 Windows Vista 开始, SystemPowerStateContext成员是一个只读的、部分不透明的SYSTEM_POWER_STATE_CONTEXT结构,它包含有关计算机以前系统电源状态的信息。 如果SystemPowerState为 PowerSystemWorking,则为参数。 power. State,此结构中的两个标志位指示计算机是否进入 S0 () 系统状态下运行。 有关详细信息,请参阅将 快速启动从休眠状态中唤醒

下表显示 IRP_MN_SET_POWER 的内容。Parameters。幂{State |ShutdownType}和每个系统电源转换的SYSTEM_POWER_STATE_CONTEXT结构中的CurrentSystemStateTargetSystemStateEffectiveSystemState位域。 每一行代表一个 IRP_MN_SET_POWER

切换 状态 关闭类型 当前 SystemState 目标 SystemState 有效的 SystemState 注释
睡眠 .。。 S3 睡眠状态 S0 S3 S3
...醒来 S0 睡眠状态 S3 S0 S0
混合睡眠到 .。。 S4 休眠 S0 S3 S4 睡眠文件睡眠 (Fast S4)
...醒来 S0 睡眠状态 S3 S0 S0
...唤醒/PwrLost S0 睡眠状态 S4 S0 S0
休眠到 .。。 S4 休眠 S0 S4 S4
...醒来 S0 睡眠状态 S4 S0 S0
混合关闭到 .。。 S4 休眠 S0 S5 S4 应用已关闭,用户已注销,如同关机 (Hiber Boot)
...快速启动 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 传递到下一个驱动程序。 例如,如果设备需要 inrush current,则 PowerDeviceD0 请求可能会出现延迟,因此必须使用另一个此类设备串行启动。

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

IRP_MN_SET_POWER系统电源状态

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

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

如果可能,电源管理器会发送IRP_MN_QUERY_POWER,IRP_MN_SET_POWER请求系统睡眠状态。 但是,在某些情况下 (用户按"关机"按钮或电池即将) ,电源管理器可能会发出IRP_MN_SET_POWER查询。 电源管理器仅查询睡眠状态;它永远不会在启动之前进行查询。

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

筛选器驱动程序通常不需要处理系统集电源 IRP,只需传递它。

但是,设备电源策略所有者在传递 IRP 之前设置 IoCompletion 例程。 在 IoCompletion 例程中,它 IRP_MN_SET_POWER设备电源 IRP 的请求。 有关详细信息,请参阅在设备电源 Set-Power IRP 中处理系统配置 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 启动下一个电源 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 的 set-power 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

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT