IRP_MN_SET_POWER
此 IRP 會通知驅動程式變更系統電源狀態,或設定裝置的裝置電源狀態。
主要程式碼
傳送時
系統電源管理員或裝置電源原則擁有者可以傳送此 IRP。
電源管理員會傳送此 IRP 來通知驅動程式變更系統電源狀態。 如果驅動程式已註冊其裝置以進行閒置偵測,電源管理員會傳送此 IRP 來變更閒置裝置的電源狀態。
擁有電源原則的驅動程式會傳送此 IRP 來設定其裝置的裝置電源狀態。 驅動程式必須呼叫 PoRequestPowerIrp 以傳送此 IRP。
電源管理員會在 IRQL = PASSIVE_LEVEL將此 IRP 傳送至在 PDO 中設定DO_POWER_PAGABLE旗標的裝置堆疊。 這類堆疊中的驅動程式可以觸碰分頁的程式碼或資料,以完成要求。
如果已設定DO_POWER_INRUSH旗標,電源管理員可以在 IRQL = DISPATCH_LEVEL傳送 IRP。 這類驅動程式無法直接或間接存取任何分頁程式碼或資料。
輸入參數
Parameters.Power.Type成員會指定要設定的電源狀態類型,可以是SystemPowerState或DevicePowerState。
Parameters.Power.State成員會指定電源狀態本身,如下所示:
如果 Parameters.Power.Type 是 SystemPowerState,則此值為 SYSTEM_POWER_STATE 類型的列舉值。
如果 Parameters.Power.Type 為 DevicePowerState,則此值為 DEVICE_POWER_STATE 類型的列舉值。
Parameters.Power.ShutdownType成員會指定所要求轉換的其他資訊。 這個成員的可能值 是POWER_ACTION 列舉值。 如需詳細資訊,請參閱 系統電源動作。
從 Windows Vista 開始, Parameters.Power.SystemPowerStateCoNtext 成員是唯讀、部分不透明 SYSTEM_POWER_STATE_CONTEXT 結構,其中包含電腦先前系統電源狀態的相關資訊。 如果 Parameters.Power.Type 為 SystemPowerState 且 Parameters.Power.State 為 PowerSystemWorking,則此結構中的兩個旗標位會指出電腦是否進入 S0 (運作) 系統狀態。 如需詳細資訊,請參閱 區分快速啟動與喚醒與休眠。
下表顯示IRP_MN_SET_POWER的內容。Parameters.Power。{State|ShutdownType}和每個系統電源轉換之SYSTEM_POWER_STATE_CONTEXT結構中的CurrentSystemState、TargetSystemState和EffectiveSystemState位欄位。 每個資料列都代表一個 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 指定 PowerDeviceD1、 PowerDeviceD2或 PowerDeviceD3,且系統設定電源 IRP 為使用中, 則 Parameters.Power.ShutdownType 的值會提供系統 IRP 的相關資訊。
休眠路徑上的裝置驅動程式應該檢查此值。 如果 IRP 要求 PowerDeviceD3 和 ShutdownType 為 PowerActionHibernate,這類驅動程式應該儲存還原裝置所需的任何內容,但不應該關閉裝置電源;當電腦失去電源時,裝置會進入 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) |