共用方式為


IRP_MN_QUERY_POWER

此 IRP 會查詢裝置,以判斷系統電源狀態或裝置電源狀態是否可以變更。

主要程序代碼

IRP_MJ_POWER

傳送時

電源管理員或裝置電源原則擁有者會傳送此 IRP 來判斷它是否可以變更系統或裝置電源狀態,通常是進入睡眠狀態。 驅動程式必須呼叫 PoRequestPowerIrp 來配置並傳送此 IRP。

電源管理員會將此 IRP 傳送至 IRQL = PASSIVE_LEVEL,以在 PDO 中設定DO_POWER_PAGABLE旗標的裝置堆疊。

如果已設定DO_POWER_INRUSH旗標,Power Manager 可以在 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 類型的列舉值。

輸出參數

沒有。

I/O 狀態區塊

驅動程式會將 Irp-IoStatus.Status> 設定為 STATUS_SUCCESS,表示裝置可以進入要求的狀態。 驅動程式會設定任何適當的失敗狀態,指出它無法進入要求的狀態。

行動

IRP_MN_QUERY_POWER的參數與IRP_MN_SET_POWER的參數相同。 不過, IRP_MN_QUERY_POWER 查詢系統或裝置是否可以進入特定電源狀態,而不是通知驅動程式無法撤銷的電源狀態變更。

驅動程式不得變更其裝置的電源狀態,以回應 IRP_MN_QUERY_POWER 要求。

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

系統電源狀態的IRP_MN_QUERY_POWER

電源管理員會傳送此 IRP,以確保它可以變更系統電源狀態,而不會中斷工作,例如卸除網路連線。

可能的話,電源管理員會在傳送 IRP_MN_SET_POWER 之前查詢,以要求系統睡眠狀態或正常系統關機。 不過,在某些危急狀況下,電源管理員可能會傳送IRP_MN_SET_POWER要求,而不先傳送查詢電源要求。 電源管理員只會查詢睡眠狀態;在返回工作狀態之前,它永遠不會查詢。

當驅動程式收到系統電源查詢 IRP 時,如果無法支援任何適用於已查詢系統狀態的裝置狀態,它應該會失敗 IRP。 如需詳細資訊,請參閱 DeviceState。 否則,驅動程式應將 IRP 傳遞至下一個較低的驅動程式。 巴士司機完成 IRP。

從 Windows Vista 開始,轉換至系統睡眠狀態會被視為重大作業。 雖然驅動程式可能會因為系統查詢電源 IRP 而失敗,但電源管理員仍可能會將系統電源狀態變更為睡眠狀態。 在驅動程式收到系統查詢電源 IRP 之後,驅動程式應該一律為系統電源狀態的後續變更做好準備。

當裝置電源原則擁有者收到系統電源查詢 IRP 時,它應該先在 IRP 中設定 IoCompletion 例程,再將其傳遞。 在 IoCompletion 例程中,它應該傳送適用於已查詢系統狀態之裝置狀態 的IRP_MN_QUERY_POWER 。 如需詳細資訊,請參閱 在裝置電源原則擁有者中處理系統 Query-Power IRP

當 IRP 指定 PowerSystemShutdown (S5)時, Parameters.Power.ShutdownType 的值會提供關機的原因。 ShutdownType 會告知驅動程式系統是否重設 (PowerActionShutdownReset) 或無限期關閉電源,以便稍後重新啟動 (PowerActionShutdownOff)。 對於大部分裝置的驅動程式而言,差異在於不合時常數。 不過,對於某些裝置,例如執行 DMA 的視訊串流裝置,驅動程式可能會在系統重設時選擇關閉其裝置電源,從而停止任何進行中的 I/O。

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

如果驅動程式因系統電源狀態 的IRP_MN_QUERY_POWER 要求失敗,電源管理員通常會發出 IRP_MN_SET_POWER IRP 來回應。 通常,此 IRP 會重申目前的系統狀態。 不過,驅動程式可能會收到查詢狀態或某些其他中繼狀態 的IRP_MN_SET_POWER 。 驅動程式應該準備好處理這些情況。

裝置電源狀態的IRP_MN_QUERY_POWER

裝置電源原則擁有者會將此 IRP 傳送至其堆疊,以響應系統 IRP_MN_QUERY_POWER 要求。

如果驅動程式可以將其裝置置於要求的裝置狀態,它會將 IoStatus.Status 設定為 STATUS_SUCCESS,並將IRP向下傳遞至下一個較低的驅動程式,依此類推,直到IRP到達總線驅動程序為止。 如果堆疊中的任何驅動程式必須失敗 IRP,該驅動程式應該呼叫 IoCompleteRequest 並傳回失敗狀態,立即完成 IRP。 IRP 失敗的驅動程式不會將它進一步傳遞至堆疊。

藉由傳回STATUS_SUCCESS,驅動程式會保證它不會啟動任何作業,而無法變更其設定要求電源狀態的能力。 驅動程式應該將需要這類作業的任何 IRP 排入佇列,直到它完成將裝置傳回可接受的電源狀態的設定電源 IRP 為止。

在 Windows 2000 和更新版本的系統上,當 IRP 指定 PowerDeviceD1PowerDeviceD2 或PowerDeviceD3 時, Parameters.Power.ShutdownType 的值會提供目前系統電源 IRP 的相關信息,如果系統電源 IRP 為作用中。 在此情況下, ShutdownType 的值會指出目前要求的系統電源狀態,如果系統要求未完成,則 為 PowerActionNone 。 在 Windows 98/Me 上,當 IRP 要求裝置電源狀態時,此欄位一律包含 PowerActionNone

需求

頁眉: Wdm.h (包括 Wdm.h、Ntddk.h 或 Ntifs.h)

另請參閱

IRP_MN_SET_POWER

PoRequestPowerIrp

PoStartNextPowerIrp