IRP_MN_SET_POWER

此 IRP 會通知驅動程式變更系統電源狀態,或設定裝置的裝置電源狀態。

主要程式碼

IRP_MJ_POWER

傳送時

系統電源管理員或裝置電源原則擁有者可以傳送此 IRP。

電源管理員會傳送此 IRP 來通知驅動程式變更系統電源狀態。 如果驅動程式已註冊其裝置以進行閒置偵測,電源管理員會傳送此 IRP 來變更閒置裝置的電源狀態。

擁有電源原則的驅動程式會傳送此 IRP 來設定其裝置的裝置電源狀態。 驅動程式必須呼叫 PoRequestPowerIrp 以傳送此 IRP。

電源管理員會在 IRQL = PASSIVE_LEVEL將此 IRP 傳送至在 PDO 中設定DO_POWER_PAGABLE旗標的裝置堆疊。 這類堆疊中的驅動程式可以觸碰分頁的程式碼或資料,以完成要求。

如果已設定DO_POWER_INRUSH旗標,電源管理員可以在 IRQL = DISPATCH_LEVEL傳送 IRP。 這類驅動程式無法直接或間接存取任何分頁程式碼或資料。

輸入參數

Parameters.Power.Type成員會指定要設定的電源狀態類型,可以是SystemPowerStateDevicePowerState

Parameters.Power.State成員會指定電源狀態本身,如下所示:

  • 如果 Parameters.Power.TypeSystemPowerState,則此值為 SYSTEM_POWER_STATE 類型的列舉值。

  • 如果 Parameters.Power.TypeDevicePowerState,則此值為 DEVICE_POWER_STATE 類型的列舉值。

Parameters.Power.ShutdownType成員會指定所要求轉換的其他資訊。 這個成員的可能值 是POWER_ACTION 列舉值。 如需詳細資訊,請參閱 系統電源動作

從 Windows Vista 開始, Parameters.Power.SystemPowerStateCoNtext 成員是唯讀、部分不透明 SYSTEM_POWER_STATE_CONTEXT 結構,其中包含電腦先前系統電源狀態的相關資訊。 如果 Parameters.Power.TypeSystemPowerStateParameters.Power.StatePowerSystemWorking,則此結構中的兩個旗標位會指出電腦是否進入 S0 (運作) 系統狀態。 如需詳細資訊,請參閱 區分快速啟動與喚醒與休眠

下表顯示IRP_MN_SET_POWER的內容。Parameters.Power。{State|ShutdownType}和每個系統電源轉換之SYSTEM_POWER_STATE_CONTEXT結構中的CurrentSystemStateTargetSystemStateEffectiveSystemState位欄位。 每個資料列都代表一個 IRP_MN_SET_POWER

轉換 狀態 關機類型 目前 SystemState 目標 SystemState 有效的 SystemState 註解
睡眠... S3 睡眠 S0 S3 S3
...喚醒 S0 睡眠 S3 S0 S0
混合式睡眠... S4 休眠 S0 S3 S4 休眠檔案 (Fast S4)
...喚醒 S0 睡眠 S3 S0 S0
...Wake/PwrLost S0 睡眠 S4 S0 S0
休眠至... S4 休眠 S0 S4 S4
...喚醒 S0 睡眠 S4 S0 S0
混合式關機... S4 休眠 S0 S5 S4 應用程式已關閉,使用者登出,就像關閉 (休眠開機)
...快速啟動 S0 睡眠 S4 S0 S0
關閉至... S5 關機/重設/關閉 S0 S5 S5
...系統開機 沒有用於開機的 S-IRP

輸出參數

Parameters.Power.SystemCoNtext 保留供系統使用。

I/O 狀態欄塊

驅動程式會將 Irp-IoStatus.Status > 設定為 STATUS_SUCCESS,以指出裝置已進入要求的狀態。

驅動程式不得失敗要求來設定系統電源狀態。

位於匯流排驅動程式上方的函式和篩選驅動程式不得失敗,無法要求設定裝置電源狀態。 如果裝置已移除或正在移除,匯流排驅動程式可能會失敗裝置電源要求。

作業

電源管理員或驅動程式可以要求 IRP_MN_SET_POWER IRP。 電源管理員會基於下列其中一個原因傳送此 IRP:

  • 通知驅動程式變更系統電源狀態

  • 變更電源管理員執行閒置偵測的裝置電源狀態

  • 若要在驅動程式在系統電源狀態的 IRP_MN_QUERY_POWER 要求失敗之後,使目前的系統狀態失效。 如需詳細資訊,請參閱 IRP_MN_QUERY_POWER

擁有裝置電源原則的驅動程式會傳送 IRP_MN_SET_POWER 來變更其裝置的電源狀態。

在任何指定的時間,系統只允許每個裝置物件使用一個這類 IRP。

每個驅動程式都必須呼叫 IoCallDriver (從 Windows Vista) 或 PoCallDriver (Windows Server 2003、Windows XP 和 Windows 2000) 開始,將每個電源 IRP 傳遞至下一個較低的驅動程式。 PoCallDriver介面類別似于IoCallDriver的介面,不同之處在于電源管理子系統可能會在將 IRP 傳遞至下一個驅動程式之前延遲 IRP。 例如,如果裝置需要目前且必須以序列方式與另一個這類裝置一起啟動,則 PowerDeviceD0 要求可能會發生延遲。

驅動程式在 Windows Server 2003、Windows XP 或 Windows 2000 上收到IRP_MN_SET_POWER要求之後,驅動程式必須呼叫PoStartNextPowerIrp,如呼叫 PoStartNextPowerIrp中所述。 從 Windows Vista 開始,不需要呼叫 PoStartNextPowerIrp ,這類呼叫不會執行電源管理作業。

系統電源狀態的IRP_MN_SET_POWER

只有系統電源管理員可以傳送系統設定電源 IRP。

驅動程式不得失敗要求來設定系統電源狀態。

可能的話,電源管理員會先傳送 IRP_MN_QUERY_POWER, 再傳送 IRP_MN_SET_POWER 要求系統睡眠狀態。 不過,在某些情況下, (例如使用者按下 電源 關閉按鈕或電池過期) ,電源管理員可能會發出 IRP_MN_SET_POWER 而不先查詢。 電源管理員只會查詢睡眠狀態;它永遠不會在啟動之前進行查詢。

IRP_MN_SET_POWER要求會傳送至裝置裝置堆疊中的頂端驅動程式。 頂端驅動程式會將 IRP 向下傳遞至下一個較低的驅動程式,依此類推,直到 IRP 到達匯流排驅動程式為止,這必須完成 IRP。

篩選驅動程式通常不需要對系統集電源 IRP 採取行動,而不需將其傳遞。

不過,裝置電源原則擁有者會在傳遞 IRP 之前設定 IoCompletion 常式。 在 IoCompletion 常式中,它會傳送裝置電源 IRP 的IRP_MN_SET_POWER 要求。 如需詳細資訊,請參閱 在裝置電源原則擁有者中處理系統Set-Power IRP

系統設定電源 IRP 會通知驅動程式系統電源狀態的變更即將發生,而且驅動程式必須為其做好準備。 不過,在驅動程式收到裝置電源狀態 的IRP_MN_SET_POWER 之前,驅動程式不應該變更 其裝置 的電源狀態。

Parameters.Power.ShutdownType上的值會提供有關擱置動作的其他資訊。 當 IRP 指定 PowerSystemShutdown (S5) 時,驅動程式可以判斷系統是否重設 (PowerActionShutdownReset) ,或無限期關閉電源,以在稍後 (PowerActionShutdownOff) 重新開機 。 對於大部分裝置的驅動程式而言,差異在於不區分。 不過,對於某些裝置,例如視訊串流裝置,驅動程式可能會關閉裝置電源,以便在系統重設時停止 I/O。

在 Windows 2000 和更新版本的作業系統上, ShutdownType 的值也可以是 PowerActionShutdown。 在此情況下,驅動程式無法分辨所要求的關機類型,因此應該繼續進行重設。

裝置電源狀態

位於匯流排驅動程式上方的函式和篩選驅動程式不得失敗,無法要求設定裝置電源狀態。 如果裝置已移除或正在移除,匯流排驅動程式可能會失敗裝置電源要求。

驅動程式必須先將裝置設定為要求的狀態,才能完成 IRP。

當 IRP 要求轉換至較低電源狀態時,驅動程式必須處理 IRP,因為它會向下移動裝置堆疊,儲存驅動程式將需要還原到工作狀態的任何內容。 在匯流排驅動程式收到 IRP 之後,驅動程式:

  • 儲存驅動程式需要將裝置還原至工作狀態的任何內容。

  • 將裝置設定為要求的電源狀態。

  • 呼叫 PoSetPowerState 以通知電源管理員。

  • 呼叫 PoStartNextPowerIrp 以啟動下一個 Power IRP (Windows Server 2003、Windows XP 和 Windows 2000 僅) 。

  • 完成裝置電源 IRP。

驅動程式必須及時完成此 IRP。 一般而言,驅動程式應該避免一般使用者發現明顯緩慢的任何延遲。 例如,驅動程式可能會延遲系統狀態變更來排清快取的磁片或網路資料,但不應該讓網路連線保持運作或格式化磁帶。 如需詳細資訊,請參閱 傳遞 Power IRP

在 Windows 2000 和更新版本的作業系統上,如果 IRP 指定 PowerDeviceD1PowerDeviceD2PowerDeviceD3,且系統設定電源 IRP 為使用中, 則 Parameters.Power.ShutdownType 的值會提供系統 IRP 的相關資訊。

休眠路徑上的裝置驅動程式應該檢查此值。 如果 IRP 要求 PowerDeviceD3ShutdownTypePowerActionHibernate,這類驅動程式應該儲存還原裝置所需的任何內容,但不應該關閉裝置電源;當電腦失去電源時,裝置會進入 D3 狀態。

在 Windows 2000 和更新版本的作業系統上,如果要求的電源狀態為PowerDeviceD0,驅動程式就不應該依賴ShutdownType的值。

在 Windows 98/Me 上,如果 IRP 要求裝置電源狀態, ShutdownType 一律為 PowerActionNone

判斷何時關閉裝置的驅動程式會根據裝置類別而有所不同。

判斷何時啟動裝置的驅動程式幾乎一律是存取裝置註冊的驅動程式。 驅動程式必須先確認裝置處於 D0 狀態,才能存取裝置的硬體暫存器。 如果裝置不是處於 D0 狀態,驅動程式必須呼叫 PoRequestPowerIrp 以傳送 IRP 來啟動裝置。 除非裝置處於 D0 狀態,否則驅動程式無法存取其裝置。

當驅動程式收到裝置狀態 D0 的設定電源 IRP 時,它會設定 IoCompletion 常式,並將 IRP 傳遞至下一個較低的驅動程式。

當 IRP 到達匯流排驅動程式時,該驅動程式會將 (或重設) 電源套用至裝置、呼叫 PoStartNextPowerIrp (Windows Server 2003、Windows XP 和 Windows 2000 僅) ,並呼叫 PoSetPowerState 通知電源管理員裝置的新電源狀態。

在匯流排驅動程式完成電源 IRP 之後,函式和篩選驅動程式會在其 IoCompletion 常式中處理 IRP,因為它會備份裝置堆疊。 在 IoCompletion 常式中,每個驅動程式都會還原或重新初始化其裝置內容,並執行任何其他必要的啟動工作。

如需詳細資訊,請參閱 處理裝置電源狀態的IRP_MN_SET_POWER

規格需求

標頭

Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另請參閱

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT