Share via


IRP_MN_QUERY_POWER

Questo IRP esegue una query su un dispositivo per determinare se lo stato di alimentazione del sistema o lo stato di alimentazione del dispositivo possono essere modificati.

Codice principale

IRP_MJ_POWER

Data di invio

Il proprietario del risparmio energia o di un dispositivo invia questo IRP per determinare se può modificare lo stato di alimentazione del sistema o del dispositivo, in genere per passare alla sospensione. Un driver deve chiamare PoRequestPowerIrp per allocare e inviare questo IRP.

Il risparmio energia invia questo IRP in IRQL = PASSIVE_LEVEL agli stack di dispositivi che impostano il flag DO_POWER_PAGABLE nel PDO.

Il risparmio energia può inviare l'IRP in IRQL = DISPATCH_LEVEL se è impostato il flag di DO_POWER_INRUSH. Tali driver non possono accedere direttamente o indirettamente a codice o dati di paging.

Parametri di input

Parameters.Power.Type specifica il tipo di stato di alimentazione impostato, SystemPowerState o DevicePowerState.

Parameters.Power.State specifica lo stato di alimentazione stesso, come indicato di seguito:

  • Se Parameters.Power.Type è SystemPowerState, il valore è un enumeratore del tipo SYSTEM_POWER_STATE .

  • Se Parameters.Power.Type è DevicePowerState, il valore è un enumeratore del tipo DEVICE_POWER_STATE .

Parameters.Power.ShutdownType specifica informazioni aggiuntive sulla transizione richiesta. I valori possibili sono enumeratori del tipo POWER_ACTION .

Parametri di output

Nessuno.

Blocco dello stato I/O

Un driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS per indicare che il dispositivo può entrare nello stato richiesto. Un driver imposta lo stato di errore appropriato per indicare che non può entrare nello stato richiesto.

Operazione

I parametri per IRP_MN_QUERY_POWER sono identici a quelli per IRP_MN_SET_POWER. Invece di notificare ai driver una modifica irrevocabile allo stato di alimentazione, IRP_MN_QUERY_POWER interroga se il sistema o un dispositivo può entrare in un determinato stato di alimentazione.

Un driver non deve modificare lo stato di alimentazione del dispositivo in risposta a una richiesta di IRP_MN_QUERY_POWER .

Dopo che un driver riceve una richiesta di IRP_MN_QUERY_POWER in Windows Server 2003, Windows XP e Windows 2000, un driver deve chiamare PoStartNextPowerIrp, come descritto in Chiamata di PoStartNextPowerIrp. A partire da Windows Vista, la chiamata a PoStartNextPowerIrp non è necessaria e tale chiamata non esegue alcuna operazione di risparmio energia.

IRP_MN_QUERY_POWER per uno stato di alimentazione del sistema

Il risparmio energia invia questo IRP per assicurarsi che possa modificare lo stato di alimentazione del sistema senza interrompere il lavoro, ad esempio l'eliminazione delle connessioni di rete.

Quando possibile, il risparmio energia esegue una query prima di inviare IRP_MN_SET_POWER per richiedere uno stato di sospensione del sistema o un arresto normale del sistema. Tuttavia, in alcune condizioni critiche, ad esempio l'utente che preme il pulsante di accensione o la scadenza di una batteria, il risparmio energia potrebbe inviare una richiesta di IRP_MN_SET_POWER senza prima inviare una richiesta di alimentazione della query. Il risparmio energia esegue query solo per gli stati di sospensione; non esegue mai query prima di tornare allo stato di lavoro.

Quando un driver riceve un IRP di power query di sistema, l'IRP deve avere esito negativo se non è in grado di supportare uno degli stati del dispositivo validi per lo stato del sistema sottoposto a query. Per altre informazioni, vedere DeviceState. In caso contrario, il driver deve passare l'IRP al driver inferiore successivo. Il conducente dell'autobus completa l'IRP.

A partire da Windows Vista, la transizione a uno stato di sospensione del sistema è considerata un'operazione critica. Anche se un driver potrebbe non riuscire con un IRP di potenza di sistema, il risparmio energia potrebbe comunque modificare lo stato di alimentazione del sistema in uno stato di sospensione. Dopo che un driver riceve un IRP per query di sistema, il driver deve essere sempre preparato per una modifica successiva dello stato di alimentazione del sistema.

Quando un proprietario dei criteri di risparmio energia del dispositivo riceve un IRP di power query di sistema, deve impostare una routine IoCompletion in IRP prima di passarla. Nella routine IoCompletion deve inviare un IRP_MN_QUERY_POWER per uno stato del dispositivo valido per lo stato del sistema sottoposto a query. Per altre informazioni, vedere Gestione di un Query-Power IRP di sistema in un proprietario di Criteri di risparmio energia del dispositivo.

Quando L'IRP specifica PowerSystemShutdown (S5), il valore in Parameters.Power.ShutdownType fornisce un motivo per l'arresto. ShutdownType indica al driver se il sistema sta reimpostando (PowerActionShutdownReset) o spegnendo per un periodo illimitato il riavvio in un secondo momento (PowerActionShutdownOff). Per i driver della maggior parte dei dispositivi, la differenza è inconsequential. Tuttavia, per determinati dispositivi, ad esempio un dispositivo di streaming video che esegue DMA, un driver potrebbe scegliere di spegnere il dispositivo quando il sistema viene reimpostato, interrompendo così qualsiasi I/O in corso.

Nei sistemi Microsoft Windows 2000 e versioni successive il valore di ShutdownType può anche essere PowerActionShutdown. In questo caso, il driver non può indicare il tipo di arresto richiesto e deve pertanto procedere come per una reimpostazione.

Se un driver non riesce una richiesta di IRP_MN_QUERY_POWER per uno stato di alimentazione del sistema, il risparmio energia risponde in genere emettendo un IRP_MN_SET_POWER IRP. In genere, questo IRP riconferma lo stato corrente del sistema. Tuttavia, è possibile che i driver ricevano un IRP_MN_SET_POWER allo stato sottoposto a query o a un altro stato intermedio. I driver devono essere preparati a gestire queste situazioni.

IRP_MN_QUERY_POWER per uno stato di alimentazione del dispositivo

Un proprietario dei criteri di risparmio energia del dispositivo invia questo IRP allo stack in risposta a una richiesta di IRP_MN_QUERY_POWER di sistema.

Se un driver può inserire il dispositivo nello stato del dispositivo richiesto, imposta IoStatus.Status su STATUS_SUCCESS e passa l'IRP al driver inferiore successivo e così via fino a raggiungere il driver del bus. Se un driver nello stack deve avere esito negativo, il driver deve completare immediatamente l'IRP chiamando IoCompleteRequest e restituendo uno stato di errore. I driver che non soddisfano l'IRP non lo passano più avanti nello stack.

Restituendo STATUS_SUCCESS, il driver garantisce che non avvii alcuna operazione che cambierebbe la capacità di impostare lo stato di alimentazione richiesto. Il driver deve accodare tutti i provider di integrazione che richiedono tali operazioni fino a quando non completa un IRP di alimentazione set-power che restituisce il dispositivo a uno stato di alimentazione accettabile.

Nei sistemi Windows 2000 e versioni successive, quando l'IRP specifica PowerDeviceD1, PowerDeviceD2 o PowerDeviceD3, il valore in Parameters.Power.ShutdownType fornisce informazioni sull'IRP di alimentazione di sistema corrente, se è attivo un IRP di alimentazione di sistema. In questo caso, il valore in ShutdownType indica lo stato di alimentazione del sistema attualmente richiesto o PowerActionNone se una richiesta di sistema non è in sospeso. In Windows 98/Me questo campo contiene sempre PowerActionNone quando l'IRP richiede uno stato di alimentazione del dispositivo.

Requisiti

Intestazione

Wdm.h (include Wdm.h, Ntddk.h o Ntifs.h)

Vedi anche

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoRequestPowerIrp

PoStartNextPowerIrp