等候/喚醒回呼常式
當驅動程式要求等候/喚醒 IRP 時,它必須指定回呼常式,以便在喚醒事件發生時,將裝置傳回工作狀態 (D0) 。 喚醒事件發生且所有驅動程式都已完成 IRP 之後,系統會呼叫傳遞至 PoRequestPowerIrp的回呼常式。
由於此回呼常式是代表產生 IRP 的驅動程式設定,而不是用於處理 IRP 的驅動程式,因此它不得呼叫 PoStartNextPowerIrp;只有設定為驅動程式的 IoCompletion 常式才會將 IRP 向下堆疊啟動下一個電源 IRP。 請記住,除了在要求等候/喚醒 IRP 時設定回呼常式之外,原則擁有者不僅會傳送 IRP,也會處理 IRP,因此可能會設定 IoCompletion 常式,
回呼常式具有下列責任:
如果驅動程式控制多個裝置,請判斷其哪些裝置發出喚醒訊號。
服務造成喚醒訊號的事件。
呼叫 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 之後,裝置才會返回工作狀態。