共用方式為


DispatchPower 常式

驅動程式的 DispatchPower 常式支援 電源管理 ,方法是處理 IRP_MJ_POWER I/O 函式程式碼的 IRP。 與 IRP_MJ_POWER 函式程式碼相關聯的是 Power Management 的幾個次要 I/O 函式程式碼。 電源管理員會使用這些次要函式程式碼來指示驅動程式變更電源狀態、等候和回應系統喚醒事件,以及查詢驅動程式的相關裝置。

每個驅動程式的 DispatchPower 常式都會執行下列工作:

  • 可能的話,請處理 IRP。

  • 使用 PoCallDriver,將 IRP 傳遞至裝置堆疊中的下一個較低驅動程式。

  • 如果匯流排驅動程式,請在裝置上執行要求的電源作業,並完成 IRP。

裝置的所有驅動程式都必須有機會處理裝置的電源 IRP,但少數情況下允許函式或篩選驅動程式使 IRP 失敗。 大部分的函式和篩選驅動程式都會執行一些處理,或為每個電源 IRP 設定 IoCompletion 常式,然後將 IRP 向下傳遞至下一個較低的驅動程式,而不需完成。 最後,IRP 會到達匯流排驅動程式,視需要實際變更裝置的電源狀態,並完成 IRP。

當 IRP 完成時,I/O 管理員會呼叫驅動程式設定的任何 IoCompletion 常式,因為 IRP 會向下移動裝置堆疊。 驅動程式是否需要設定完成常式,取決於 IRP 的類型和驅動程式的個別需求。

啟動裝置的電源 IRP 必須先由裝置堆疊中的最低驅動程式處理, (基礎匯流排驅動程式) ,然後由每個後續驅動程式向上堆疊處理。 關閉裝置電源的電源 IRP 必須先由裝置堆疊頂端的驅動程式處理,然後由每個後續驅動程式向下堆疊處理。

卸載式裝置的特殊處理

在其 DispatchPower 常式中,卸載式裝置的驅動程式應該檢查裝置是否仍然存在。 如果裝置已移除,驅動程式不應該將 IRP 向下傳遞至下一個較低的驅動程式。 相反地,驅動程式應該執行下列動作:

  • 呼叫 PoStartNextPowerIrp 以開始處理下一個電源 IRP。

  • [Irp-IoStatus.Status > ] 設定為 [STATUS_DELETE_PENDING]。

  • 呼叫 IoCompleteRequest,並指定IO_NO_INCREMENT來完成 IRP。

  • 傳回STATUS_DELETE_PENDING。