當驅動程式要求等候/喚醒 IRP 時,它必須指定回呼常式,以便在喚醒事件發生時將裝置傳回工作狀態 (D0) 。 發生喚醒事件且所有驅動程式完成 IRP 之後,系統會呼叫傳遞至 PoRequestPowerIrp 的回呼函式。
因為此回呼常式是由產生 IRP 的驅動程式設定,而不是由處理 IRP 的驅動程式設定,所以它不得呼叫 PoStartNextPowerIrp; 只有在驅動程式將 IRP 傳遞下去時由 IoCompletion 常式設定的情況下,才應該啟動下一個電源 IRP。 請記住,策略擁有者不僅會傳送 IRP,還會處理它,因此在它將 IRP 傳遞到堆疊的過程中,可能會設定 IoCompletion 常式。此外,在其要求等候/喚醒 IRP 時,也可能會設定回呼常式。
回呼函式具有下列職責:
如果驅動程式控制多個裝置,請判斷其哪些裝置發出喚醒訊號。
處理引發喚醒訊號的事件。
呼叫 PoRequestPowerIrp 來傳送 PowerDeviceD0 要求,以設定在 D0 狀態中發出喚醒訊號的裝置。 驅動程式也必須呼叫 PoSetPowerState ,以通知電源管理員新的裝置電源狀態。 如需詳細資訊,請參閱 針對裝置電源狀態傳送的 IRP_MN_QUERY_POWER 或 IRP_MN_SET_POWER。
如果驅動程式設定 IRP 的 Cancel 常式,請呼叫 IoSetCancelRoutine 將 Cancel 常式重設為 Null。
如果驅動程式擁有多個裝置的電源原則,請遞減其等候/喚醒參考計數。 如果計數為非零,表示另一個裝置先前已傳送等候/喚醒 IRP,請要求另一個等候/喚醒 IRP (PoRequestPowerIrp) 以取得其 PDO。
例如,PCI 裝置可能已為數據機和網路介面卡 (NIC) 啟用等候/喚醒。 如果 NIC 喚醒系統(因此完成 IRP),PCI FDO 必須將另一個等候/喚醒 IRP 傳送至自身,以確保調製解調器仍能夠喚醒。
因為要求等候/喚醒 IRP 的驅動程式會控制其裝置堆疊的電源原則,所以它負責在 IRP 完成時將其裝置傳回工作狀態。 雖然底層驅動程式可能已經實際將電源套用至裝置,但政策擁有者必須呼叫 PoRequestPowerIrp ,以傳送裝置電源狀態 D0 的 IRP_MN_SET_POWER 要求。 只有在裝置堆疊中的所有驅動程式都處理此開機 IRP 之後,裝置才會回到工作狀態。