共用方式為


傳送裝置Set-Power IRP 以回應系統Set-Power IRP

裝置電源原則擁有者應該採取下列步驟來回應系統設定電源 IRP:

  1. 呼叫IoAcquireRemoveLock,將目前的 IRP 當做Tag參數傳遞,以確保驅動程式在處理電源 IRP 時不會收到隨插即用IRP_MN_REMOVE_DEVICE要求。

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

  2. 呼叫 IoCopyCurrentIrpStackLocationToNext來設定下一個較低驅動程式的 IRP 堆疊位置。

  3. 在系統 set-power IRP 中設定 IoCompletion 常式。

  4. 呼叫 IoMarkIrpPending ,將系統 set-power IRP 標示為擱置中。

  5. 從 Windows Server 2003、Windows XP 和 Windows 2000) 中的 Windows Vista) 或PoCallDriver (開始呼叫IoCallDriver (,以將系統設定電源 IRP 傳遞至下一個較低的驅動程式。

  6. 其 DispatchPower 常式傳回STATUS_PENDING。

IoCompletion 常式 (請參閱上述清單中的步驟 3) ,裝置電源原則擁有者會傳送裝置集電源 IRP,如下所示:

  1. 檢查系統設定電源 IRP 以取得所要求的系統電源狀態。 為系統電源狀態選擇適當的裝置電源狀態。 如需詳細資訊,請參閱 判斷正確的裝置電源狀態

  2. 呼叫 PoRequestPowerIrp 以傳送步驟 1 中所決定裝置電源狀態 的IRP_MN_SET_POWER 。 即使裝置已處於該狀態,電源原則擁有者也必須傳送裝置設定電源要求。

  3. 在呼叫PoRequestPowerIrp中指定power-completionFunction (CompletionFunction) ,並在內容緩衝區中傳遞系統設定電源 IRP。

  4. IoCompletion 常式傳回STATUS_MORE_PROCESSING_REQUIRED,讓驅動程式可以在電源完成回呼常式中完成處理系統設定電源 IRP。

請記住,裝置電源原則擁有者不僅會傳送裝置設定電源 IRP,也必須在裝置堆疊中移動時處理此 IRP。 因此,裝置電源原則擁有者不只具有與裝置設定電源 IRP 相關聯的電源完成回呼常式,以及系統設定電源 IRP 的 IoCompletion 常式,也可能是裝置設定電源 IRP 的 IoCompletion 常式。 如需詳細資訊,請參閱 處理裝置電源狀態的IRP_MN_SET_POWER

在 I/O 管理員呼叫所有設定為裝置集電源 IRP 的 IoCompletion 常式之後,I/O 管理員會呼叫電源完成回呼常式。 此時,堆疊中的所有驅動程式都已完成裝置設定電源 IRP,且裝置電源轉換已完成。

電源完成回呼常式必須執行下列動作:

  1. 呼叫 PoStartNextPowerIrp 以啟動下一個電源 IRP。 (僅限 Windows Server 2003、Windows XP 和 Windows 2000。)

  2. 完成系統設定電源 IRP (IoCompleteRequest) ,並傳回裝置設定電源 IRP 的狀態。

  3. 呼叫 IoReleaseRemoveLock 以釋放先前取得的鎖定。

  4. 傳回設定電源 IRP 完成的狀態。