共用方式為


IRP_MN_WAIT_WAKE

此 IRP 可讓驅動程式喚醒睡眠系統,或喚醒睡眠裝置。

主要程式碼

IRP_MJ_POWER

傳送時

擁有電源原則的驅動程式會將此 IRP 目標設為其 PDO,讓其裝置能夠喚醒以回應外來事件,例如來電。 驅動程式必須呼叫 PoRequestPowerIrp 以傳送此 IRP。

一般規則是,驅動程式應該在判斷其裝置應啟用喚醒時立即傳送此 IRP。 因此,大多數這類裝置的驅動程式會在開啟裝置電源之後,以及在完成 IRP_MN_START_DEVICE 要求之前,傳送此 IRP。

不過,驅動程式可以在裝置處於運作狀態 (PowerDeviceD0) 時傳送 IRP。 裝置堆疊不得處於轉換狀態;也就是說,驅動程式不應該傳送 IRP_MN_WAIT_WAKE, 而任何其他電源 IRP 在其裝置堆疊中作用中。

等候/喚醒 IRP 不會變更裝置或系統的電源狀態。 它只會啟用來自裝置的喚醒訊號。 當喚醒訊號送達時,原則擁有者必須呼叫 PoRequestPowerIrp 以傳送 set-power 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 傳遞至下一個較低的驅動程式。

作業

驅動程式會基於下列兩個原因之一傳送 IRP_MN_WAIT_WAKE

  1. 讓裝置能夠喚醒睡眠系統,以回應外部喚醒訊號。

  2. 若要讓裝置從裝置睡眠狀態喚醒,以回應外部喚醒訊號。

IRP 必須向下傳遞至裝置的匯流排驅動程式,以呼叫 IoMarkIrpPending 並從其 DispatchPower 常式傳回STATUS_PENDING。 IRP 會維持擱置狀態,直到發生喚醒訊號,或直到傳送 IRP 的驅動程式取消為止。

在任何指定時間,PDO 只能保留一個等候/喚醒 IRP 擱置中。 如果驅動程式已經保留 PDO 的等候/喚醒 IRP,它就必須讓任何其他這類 IRP 失敗並STATUS_DEVICE_BUSY。 列舉多個子 PDO 的驅動程式可以針對每個這類 PDO 暫止等候/喚醒 IRP。

每個驅動程式都會設定 IoCompletion 常式,因為 IRP 會向下移動裝置堆疊。 當裝置發出喚醒事件的訊號時,匯流排驅動程式會服務喚醒訊號並完成 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