使用 Power Manager 常式進行閒置偵測
電源管理員透過 PoRegisterDeviceForIdleDetection 和 PoSetDeviceBusy 常式提供閒置偵測的支援。
若要為其裝置啟用閒置偵測,裝置電源原則擁有者會呼叫 PoRegisterDeviceForIdleDetection 並指定:
當系統優化效能時要套用的閒置逾時值。
當系統優化以進行自動調整時,要套用的閒置逾時值。
裝置在閒置時應該轉換的裝置電源狀態。
PoRegisterDeviceForIdleDetection 會傳回閒置計數器的指標,驅動程式稍後會使用此指標來停用閒置偵測。 PoRegisterDeviceForIdleDetection的呼叫端必須在 IRQL < DISPATCH_LEVEL上執行。
驅動程式可以在裝置啟動且準備好處理裝置電源 IRP 之後,隨時註冊其裝置以進行閒置偵測。 例如,驅動程式可能會在 PnP 啟動裝置 IRP 的 IoCompletion 常式中啟用閒置偵測。
任何指定裝置的逾時值應該與裝置的電源啟動延遲成正比,並根據觀察到的裝置行為。 對於特定類型的裝置,驅動程式可以指定 -1 的允許和效能逾時值,以使用裝置類別的標準電源原則逾時。 如需詳細資訊,請參閱裝置特定檔。
當裝置正在使用時,驅動程式必須呼叫 PoSetDeviceBusy,並傳遞 PoRegisterDeviceForIdleDetection所傳回的指標。 PoSetDeviceBusy 會重設閒置計數器,因此重新開機裝置的閒置倒數計時。 驅動程式應該在每個 I/O 作業上呼叫 PoSetDeviceBusy 。
若要判斷裝置是否閒置,電源管理員會將閒置計數器的值與目前系統電源原則的驅動程式指定閒置逾時值進行比較, () 。 請參閱與系統電源原則相關的函式Microsoft Windows SDK。
當裝置滿足逾時值時,電源管理員會傳送裝置設定電源 IRP,並指定驅動程式在其呼叫 PoRegisterDeviceForIdleDetection時所傳遞的裝置電源狀態。 在傳送 set-power IRP 之前,電源管理員不會傳送查詢 IRP。 堆疊中的驅動程式會處理 set-power IRP,因為它們會處理任何其他專案;他們必須及時完成,而且無法將其失敗。 (請參閱 處理裝置Power-Down IRP.)
當驅動程式不再需要閒置偵測或未準備好處理裝置關閉電源 IRP 時,它應該再次呼叫 PoRegisterDeviceForIdleDetection ,同時針對這兩個逾時值傳遞零。 將逾時設定為零會停用電池 (電池) 和效能 (AC) 電源原則的閒置偵測。 驅動程式可以快速重新啟用閒置偵測;它只會使用非零逾時值來呼叫 PoRegisterDeviceForIdleDetection 。 驅動程式註冊裝置之後,即使裝置已關閉電源並重新喚醒,也可以藉由變更逾時值來啟用和停用閒置偵測。