IRP_MN_WAIT_WAKE
此 IRP 可讓驅動程式喚醒睡眠系統,或喚醒睡眠裝置。
主要程式碼
傳送時
擁有電源原則的驅動程式會將此 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_DEVICE_BUSY
IRP_MN_WAIT_WAKE要求已經擱置中,必須先完成或取消,才能發出另一個IRP_MN_WAIT_WAKE要求。
如果驅動程式必須失敗此 IRP,它會立即完成 IRP,而且不會將 IRP 傳遞至下一個較低的驅動程式。
作業
驅動程式會基於下列兩個原因之一傳送 IRP_MN_WAIT_WAKE :
讓裝置能夠喚醒睡眠系統,以回應外部喚醒訊號。
若要讓裝置從裝置睡眠狀態喚醒,以回應外部喚醒訊號。
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) |