驅動程式的 DispatchPower 常式會藉由處理 IRP_MJ_POWER I/O 函式碼的 IRP 來支援電源管理。 與 IRP_MJ_POWER 功能代碼相關聯的是電源管理的幾個次要 I/O 功能代碼。 電源管理員會使用這些次要函式碼來指示驅動程式變更電源狀態、等候並回應系統喚醒事件,以及查詢驅動程式的裝置相關資訊。
每個驅動程式的 DispatchPower 常式都會執行下列工作:
如果可能,請處理 IRP。
使用 PoCallDriver 將 IRP 傳遞至裝置堆疊中的下一個較低驅動程式。
如果是匯流排驅動程式,請在裝置上執行所要求的電源操作,並完成 IRP。
裝置的所有驅動程式都必須有機會處理裝置的電源 IRP,只是在少數情況下允許函式或篩選驅動程式可以不處理 IRP。 大部分的函式和篩選驅動程式都會執行一些處理,或為每個電源 IRP 設定 IoCompletion 常式,然後將 IRP 向下傳遞至下一個較低的驅動程式,而不完成它。 最終,IRP 會到達總線驅動程式,該驅動程式會在需要時實際更改裝置的電源狀態,並完成 IRP。
當 IRP 完成時,I/O 管理員會在 IRP 向下移動裝置堆疊時呼叫驅動程式所設定的任何 IoCompletion 常式。 驅動程式是否需要設定完成常式取決於 IRP 的類型和驅動程式的個別需求。
裝置啟動時的電源 IRP 必須先由裝置堆疊中最低階的驅動程式(基礎匯流排驅動程式)處理,然後逐步由堆疊上的每個層級較高的驅動程式處理。 關閉裝置電源的 IRP (電源要求封包)必須先由裝置堆疊頂端的驅動程式處理,然後由堆疊中依序的每個驅動程式處理。
可攜式裝置的特殊處理
在其 DispatchPower 常式中,抽取式裝置的驅動程式應該檢查裝置是否仍然存在。 如果已移除裝置,驅動程式不應該將 IRP 向下傳遞至下一個較低的驅動程式。 相反地,驅動程式應該執行下列動作:
呼叫 PoStartNextPowerIrp 以開始處理下一個電源 IRP。
將 Irp-IoStatus.Status> 設定為 STATUS_DELETE_PENDING。
呼叫 IoCompleteRequest,指定 IO_NO_INCREMENT,以完成 IRP。
返回STATUS_DELETE_PENDING。