IRP_MN_WAIT_WAKE

此 IRP 使驱动程序能够唤醒睡眠系统或唤醒睡眠设备。

主要代码

IRP_MJ_POWER

发送时间

拥有电源策略的驱动程序将此 IRP 定向到其 PDO,以使其设备能够唤醒以响应外部事件,例如传入电话呼叫。 驱动程序必须调用 PoRequestPowerIrp 才能发送此 IRP。

一般情况下,驱动程序应在确定应为其设备启用唤醒后立即发送此 IRP。 因此,大多数此类设备的驱动程序在开机后和完成IRP_MN_START_DEVICE请求之前发送 IRP。

但是,只要设备处于工作状态,驱动程序就可以发送 IRP, (PowerDeviceD0) 。 设备堆栈不得处于转换状态;也就是说,当任何其他电源 IRP 在其设备堆栈中处于活动状态时,驱动程序不应发送 IRP_MN_WAIT_WAKE

等待/唤醒 IRP 不会更改设备或系统的电源状态。 它只是启用来自设备的唤醒信号。 当唤醒信号到达时,策略所有者必须调用 PoRequestPowerIrp 以发送设置电源 IRP 以将其设备返回到 D0。

驱动程序必须以 IRQL = PASSIVE_LEVEL 运行才能发送此 IRP。 但是,IRP 可以在 IRQL = DISPATCH_LEVEL完成。

输入参数

Parameters.WaitWake.PowerState 包含应允许设备从中唤醒系统的最低 (最低功率) 系统电源状态。

输出参数

无。

I/O 状态块

驱动程序将 Irp-IoStatus.Status> 设置为下列值之一:

STATUS_PENDING
驱动程序已收到 IRP,并正在等待设备发出唤醒信号。

STATUS_INVALID_DEVICE_STATE
设备处于低于设备DEVICE_CAPABILITIES结构中指定的 DeviceWake 状态,或者设备无法从 IRP 中传递的 SystemWake 状态唤醒系统。

STATUS_NOT_SUPPORTED
设备不支持唤醒。

STATUS_DEVICE_BUSY
IRP_MN_WAIT_WAKE请求已挂起,必须先完成或取消请求,然后才能发出另一个IRP_MN_WAIT_WAKE请求。

STATUS_SUCCESS
设备已发出唤醒事件的信号。

STATUS_CANCELLED
IRP 已取消。

如果驱动程序必须使此 IRP 失败,它将立即完成 IRP,并且不会将 IRP 传递给下一个较低的驱动程序。

Operation

驱动程序出于以下两个原因之一发送 IRP_MN_WAIT_WAKE

  1. 使其设备能够唤醒睡眠系统以响应外部唤醒信号。

  2. 使设备能够从设备睡眠状态唤醒,以响应外部唤醒信号。

必须将 IRP 向下传递到设备的总线驱动程序,该设备调用 IoMarkIrpPending 并从其 DispatchPower 例程返回STATUS_PENDING。 IRP 一直处于挂起状态,直到出现唤醒信号或发送 IRP 的驱动程序取消它为止。

在任何给定时间,对于 PDO,只能保留一个等待/唤醒 IRP。 如果驱动程序已持有 PDO 的等待/唤醒 IRP,则必须使任何其他此类 IRP 失败并STATUS_DEVICE_BUSY。 枚举多个子 PDO 的驱动程序可以为每个此类 PDO 挂起一个等待/唤醒 IRP。

当 IRP 沿着设备堆栈向下移动时,每个驱动程序都会设置 一个 IoCompletion 例程。 当设备发出唤醒事件信号时,总线驱动程序为唤醒信号提供服务并完成 IRP,返回STATUS_SUCCESS。 然后,I/O 管理器调用下一个更高级别的驱动程序的 IoCompletion 例程,依此调用设备堆栈。

当驱动程序发送等待/唤醒 IRP 时,它应在 PoRequestPowerIrp 调用中指定回调例程。 在回调例程中,驱动程序通常为设备提供服务。 例如,设备的电源策略所有者必须调用 PoRequestPowerIrp 以发送设备状态 D0 的IRP_MN_SET_POWER

充当一个设备的总线驱动程序的驱动程序和父设备的策略所有者在收到来自子 PDO 的 IRP_MN_WAIT_WAKE 请求时请求父设备堆栈 的IRP_MN_WAIT_WAKE IRP。 如果驱动程序枚举多个子 PDO,则无论有多少子 PDO 发送等待/唤醒请求,它都应仅为父级设备堆栈请求请求一个等待/唤醒 IRP。 相反,此类驱动程序应保留等待/唤醒 IRP 的内部计数,每次收到请求时递增计数,并在每次完成请求时递减计数。 如果在完成等待/唤醒 IRP 后计数为非零,驱动程序应将另一个等待/唤醒 IRP 发送到其设备堆栈,以“重新调整”自身进行唤醒。 有关详细信息,请参阅 通过设备树了解等待/唤醒 IRP 的路径

若要取消 IRP_MN_WAIT_WAKE,驱动程序会调用 IoCancelIrp。 只有发起 IRP 的驱动程序才能取消它。 发生以下任一情况时,驱动程序会取消挂起 的IRP_MN_WAIT_WAKE

  • 驱动程序收到停止或删除设备的 PnP IRP。

  • 系统将进入睡眠状态,设备唤醒信号不得唤醒它。

要求

标头

Wdm.h(包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另请参阅

PoRequestPowerIrp