共用方式為


IRP_MN_QUERY_POWER

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

主要程式碼

IRP_MJ_POWER

傳送時

電源管理員或裝置電源原則擁有者會傳送此 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 類型的列舉值。

輸出參數

無。

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 指定 PowerDeviceD1PowerDeviceD2PowerDeviceD3時, Parameters.Power.ShutdownType 的值會提供目前系統電源 IRP 的相關資訊,如果系統電源 IRP 為使用中。 在此情況下, 在 ShutdownType 的值表示目前要求的系統電源狀態,如果系統要求未完成,則 為 PowerActionNone 。 在 Windows 98/Me 上,當 IRP 要求裝置電源狀態時,此欄位一律包含 PowerActionNone

規格需求

標頭

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

另請參閱

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoRequestPowerIrp

PoStartNextPowerIrp