等候/喚醒 IRP 完成概觀
當喚醒訊號送達時,等候/喚醒 IRP 就會完成。 喚醒訊號是裝置專屬的,但通常是裝置的一般服務事件。 例如,連入通道可能會導致睡眠數據機喚醒。
下圖顯示完成等候/喚醒 IRP 的步驟。
發生訊號時,控制會在匯流排偵測到裝置已喚醒的點重新輸入匯流排驅動程式。 匯流排驅動程式會視需要服務事件,並呼叫 IoCompleteRequest 來完成其 PDO 的 IRP_MN_WAIT_WAKE IRP。
接著,I/O 管理員會呼叫裝置堆疊中下一個較高驅動程式所設定的 IoCompletion 常式。 在 IoCompletion 常式中,該驅動程式會視需要服務喚醒訊號,並呼叫 IoCompleteRequest 來完成 IRP。 I/O 管理員會繼續呼叫 IoCompletion 常式來備份裝置堆疊,直到所有驅動程式都完成 IRP 為止。
在其 IoCompletion 常式中,列舉多個子裝置的任何驅動程式 (會建立一個以上的 PDO) ,而且已收到來自多個這類裝置的等候/喚醒要求,必須將等候/喚醒 IRP 傳送給自己,以便在另一個子系上進行等候/喚醒。 如需詳細資訊,請參閱 透過裝置樹狀結構瞭解等候/喚醒 IRP 的路徑。
呼叫驅動程式在將 IRP 向下傳遞至堆疊時所設定 的 IoCompletion 常式之後,I/O 管理員會在要求等候/喚醒 IRP 時叫用電源原則擁有者所設定的回呼常式。 在回呼常式中,原則擁有者應該將其裝置傳回工作狀態,並在有的話完成其子系 PDO 的擱置等候/喚醒 IRP。
完成子系的 IRP 會導致 I/O 管理員呼叫由子裝置堆疊中的驅動程式所設定的 IoCompletion 常式,依此類歸。 最後,在開發節點上啟動原始等候/喚醒 IRP 的原則擁有者會判斷其裝置判斷提示喚醒訊號,而且所有擱置的等候/喚醒 IRP 都將完成。