共用方式為


處理裝置Power-Up IRP

裝置電源啟動 IRP 會指定 IRP_MN_SET_POWER ,以及需要比目前裝置電源狀態更多的裝置電源狀態的裝置電源狀態。 一般而言,電源啟動 IRP 會指定裝置運作狀態 PowerDeviceD0

啟動裝置的要求必須先由裝置的基礎匯流排驅動程式處理,然後由每個後續驅動程式備份堆疊。

下圖顯示處理電源 IRP 時所涉及的步驟。

說明處理裝置電源要求的圖表。

處理電源 IRP_MN_SET_POWER要求時 ,函式或篩選驅動程式必須:

  • 呼叫 IoAcquireRemoveLock 以確保驅動程式在處理電源 IRP 時不會收到 IRP_MN_REMOVE_DEVICE 要求。

    如果 IoAcquireRemoveLock 傳回失敗狀態,驅動程式不應該繼續處理 IRP。 相反地,從 Windows Vista 開始,驅動程式應該呼叫 IoCompleteRequest 來完成 IRP,然後傳回失敗狀態。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,驅動程式應該呼叫 IoCompleteRequest 來完成 IRP,然後呼叫 PoStartNextPowerIrp 以啟動下一個電源 IRP,然後傳回失敗狀態。

  • 呼叫 IoMarkIrpPending 以標記 IRP 擱置中。

  • 呼叫 IoCopyCurrentIrpStackLocationToNext 來設定 IRP 堆疊位置。 如果驅動程式設定IoCompletion常式,則驅動程式不得呼叫IoSkipCurrentIrpStackLocation

  • 呼叫 IoSetCompletionRoutine 以設定啟動 IoCompletion 常式。

    處理裝置電源啟動 IRP 時,驅動程式應該設定 IoCompletion 常式來還原內容、釋放移除鎖定,並在 IRP 完成且裝置開啟之後執行其他必要工作。 驅動程式不應該在 IRP 完成之前還原內容。 如需詳細資訊,請參閱 裝置電源 IRP 的 IoCompletion 常式

  • 在 Windows 7 和 Windows Vista) 或PoCallDriver中呼叫IoCallDriver ( (Windows Server 2003、Windows XP 和 Windows 2000) ,以將 IRP 傳遞至下一個較低的驅動程式。 IRP 必須一直往下移動裝置堆疊到匯流排驅動程式。 只允許匯流排驅動程式完成 IRP。

  • 傳回STATUS_PENDING。

當匯流排驅動程式收到 IRP 時,應該先檢查以確保裝置仍存在,且在睡眠時尚未移除或取代。 如果裝置已不存在,匯流排驅動程式應該在父裝置上呼叫IoInvalidateDeviceRelations,以通知隨插即用管理員裝置已消失。 在此情況下,匯流排驅動程式可能會使裝置電源啟動 IRP 失敗。

如果裝置仍然存在,匯流排驅動程式接著會執行將裝置傳回作業條件所需的工作、呼叫 PoSetPowerState 以通知電源管理員新的裝置電源狀態,並完成 IRP (IoCompleteRequest) 。 如果驅動程式在裝置睡眠時已排入佇列 I/O,或裝置需要無回應電源,則匯流排驅動程式會將電源套用至裝置。 否則,匯流排驅動程式會在與裝置通訊時立即套用電源。

如需從電源關閉、待命和休眠狀態達到快速啟動時間的最佳作法清單,請參閱 改善系統啟動效能