從Low-Power狀態快速啟動
若要從低電源狀態快速啟動,分葉節點裝置的驅動程式應該處理 S0 電源 IRP (,也就是 S0 系統電源狀態 的 IRP_MN_SET_POWER IRP) 。 裝置階層中分葉節點的裝置沒有子裝置。 因為分葉節點裝置對子裝置沒有相依性,所以裝置的功能驅動程式可以將裝置重新初始化為背景工作,以避免造成作業系統或其他驅動程式不必要的延遲。 相反地,匯流排驅動程式具有相依性,需要額外的同步處理邏輯,才能與其子裝置協調電源序列。
使用下列步驟,從低電源狀態快速啟動分葉節點裝置:
設定 S0 電源 IRP 的完成常式。
將 S0 電源 IRP 向下傳送到裝置堆疊。
立即完成 S0 電源 IRP,而不是等到 D0 電源 IRP 完成為止。 當 S0 電源 IRP 的完成常式執行時,請執行下列動作:
要求 D0 電源 IRP (,也就是 D0 裝置電源狀態的 IRP_MN_SET_POWER IRP) 。
將STATUS_SUCCESS傳回 S0 電源 IRP 的完成常式。
驅動程式應排入它接收的任何 I/O 要求,但延遲處理上述任何要求,直到處理 D0 電源 IRP 完成為止。
當 D0 電源 IRP 的完成常式執行時,請初始化裝置,但將此常式限制為讓裝置可供使用所需的常式。
完成上述步驟之後,您的驅動程式就可以開始處理 I/O 要求,包括可能已排入佇列的任何 I/O 要求。
注意 上述步驟不適用於 PowerSystemWorking (S0) 以外的任何電源狀態電源 IRP 處理。 這些步驟特別適用于電源 IRP 的處理,以便從低電源狀態轉換為電源開啟 (S0) 狀態。
所有裝置都完成 S0 電源 IRP 之後,系統啟動就會完成。 在系統啟動完成時,不需要這些裝置,才能完成其 D0 電源 IRP 或完全運作。 核心電源管理員有一組有限的 IRP 分派佇列,而且必須使用這些佇列來通知系統中所有裝置,以返回 S0 狀態。 無法快速完成 S0 電源 IRP 的驅動程式可防止其他裝置的驅動程式接收其 S0 電源 IRP。 因此,設計不佳的驅動程式會造成應該同時執行的驅動程式作業,進而影響整體系統啟動效能。
驅動程式完成其 S0 電源 IRP 之後,可能會從已開啟裝置控制碼的應用程式收到 I/O 要求。 驅動程式絕對不能失敗這些 I/O 要求,因為這麼做可能會導致應用程式停止回應,並產生逾時錯誤訊息。 相反地,驅動程式必須將 I/O 要求排入佇列,直到裝置準備好處理它們為止。
匯流排驅動程式可以使用類似分葉節點裝置驅動程式所述的技術,從低電源狀態快速啟動。 匯流排驅動程式必須符合額外的需求,以確保從子裝置進入 D0 狀態的任何要求都會標示為擱置中,而且在匯流排裝置進入 D0 狀態之前,匯流排驅動程式不會完成。
例如,當 USB 中樞的匯流排驅動程式收到 S0 電源 IRP 時,驅動程式會要求 D0 電源 IRP,並在收到要求的 D0 電源 IRP 之後完成 S0 電源 IRP。 不過,在 S0 電源 IRP 完成之後,中樞的子裝置可能會開始接收其 S0 電源 IRP 並要求 D0 電源 IRP。 匯流排驅動程式應該防止子裝置進入 D0,直到中樞裝置進入 D0 為止。 因此,匯流排驅動程式應該將所有來自子裝置的 D0 電源 IRP 標示為擱置,並等候完成這些 IRP,直到匯流排驅動程式完成處理中樞的 D0 電源 IRP,並完全初始化中樞裝置為止。
如需電源 IRP 的詳細資訊,請參閱下列主題: