IRP_MN_SET_POWER

Questo IRP invia una notifica a un driver di una modifica allo stato di alimentazione del sistema o imposta lo stato di alimentazione del dispositivo per un dispositivo.

Codice principale

IRP_MJ_POWER

Data di invio

Il gestore energia del sistema o un proprietario di power policy del dispositivo può inviare questo IRP.

Il power manager invia questo IRP per notificare ai driver una modifica allo stato di alimentazione del sistema. Se un driver ha registrato il dispositivo per il rilevamento inattivo, power manager invia questo IRP per modificare lo stato di alimentazione di un dispositivo inattivo.

Un driver proprietario di criteri di alimentazione invia questo IRP per impostare lo stato di alimentazione del dispositivo per il dispositivo. Un driver deve chiamare PoRequestPowerIrp per inviare l'IRP.

Il power manager invia l'IRP in IRQL = PASSIVE_LEVEL agli stack di dispositivi che impostano il flag di DO_POWER_PAGABLE nell'oggetto PDO. I driver in tali stack possono toccare codice o dati a pagina per completare la richiesta.

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

Parametri di input

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

Il membro 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 di DEVICE_POWER_STATE .

Il membro Parameters.Power.ShutdownType specifica informazioni aggiuntive sulla transizione richiesta. I valori possibili per questo membro sono POWER_ACTION valori di enumerazione. Per altre informazioni, vedere System Power Actions.

A partire da Windows Vista, il membro Parameters.Power.SystemPowerStateContext è una struttura di sola lettura, parzialmente opaca SYSTEM_POWER_STATE_CONTEXT che contiene informazioni sugli stati di alimentazione del sistema precedenti di un computer. Se Parameters.Power.Type è SystemPowerState e Parameters.Power.State è PowerSystemWorking, due bit di flag in questa struttura indicano se un avvio rapido o una riattivazione dall'ibernazione ha causato l'immissione dello stato del sistema S0 (funzionante). Per altre informazioni, vedere Distinguere l'avvio rapido da riattivazione dall'ibernazione.

La tabella seguente mostra il contenuto di IRP_MN_SET_POWER. Parameters.Power. {Stato| ShutdownType} e i campi CurrentSystemState, TargetSystemState ed EffectiveSystemState nella struttura di SYSTEM_POWER_STATE_CONTEXT per ogni transizione di alimentazione del sistema. Ogni riga rappresenta un IRP_MN_SET_POWER.

Transizione State Tipo di arresto SystemState corrente SystemState di destinazione SystemState efficace Commenti
Dormire... S3 Sospendi S0 S3 S3
... Svegliare S0 Sospendi S3 S0 S0
Sospensione ibrida a... S4 Ibernazione S0 S3 S4 Sospensione con file di ibernazione (Fast S4)
... Svegliare S0 Sospendi S3 S0 S0
... Riattivazione/PwrLost S0 Sospendi S4 S0 S0
Hibernate to... S4 Ibernazione S0 S4 S4
... Svegliare S0 Sospendi S4 S0 S0
Arresto ibrido a... S4 Ibernazione S0 S5 S4 App chiuse, l'utente è stato disattivato come se l'arresto (Avvio hiber)
... Avvio rapido S0 Sospendi S4 S0 S0
Arresto a... S5 Arresto/reimpostazione/disattivazione S0 S5 S5
... Avvio del sistema Nessun S-IRP per l'avvio

Parametri di output

Parameters.Power.SystemContext è riservato per l'uso del sistema.

Blocco dello stato I/O

Un driver imposta Irp-IoStatus.Status> su STATUS_SUCCESS per indicare che il dispositivo ha immesso lo stato richiesto.

Un driver non deve avere esito negativo per impostare lo stato di alimentazione del sistema.

I driver di funzione e filtro che si trovano sopra un driver del bus non devono avere esito negativo per impostare uno stato di alimentazione del dispositivo. Il driver del bus può non riuscire una richiesta di accensione del dispositivo se il dispositivo viene rimosso o in fase di rimozione.

Operazione

Il risparmio energia o un driver può richiedere un IRP_MN_SET_POWER IRP. Il risparmio energia invia questo IRP per uno dei motivi seguenti:

  • Per notificare ai driver una modifica allo stato di alimentazione del sistema

  • Per modificare lo stato di alimentazione di un dispositivo per il quale il risparmio energia esegue il rilevamento inattiva

  • Per riconfermare lo stato corrente del sistema dopo che un driver ha esito negativo una richiesta di IRP_MN_QUERY_POWER per uno stato di alimentazione del sistema. Per altre informazioni, vedere IRP_MN_QUERY_POWER.

Un driver proprietario dei criteri di alimentazione del dispositivo invia IRP_MN_SET_POWER per modificare lo stato di alimentazione del dispositivo.

In qualsiasi momento, il sistema consente di attivare un solo IRP di questo tipo per ogni oggetto dispositivo.

Ogni driver deve passare ogni IRP di alimentazione al driver inferiore successivo chiamando IoCallDriver (a partire da Windows Vista) o PoCallDriver (Windows Server 2003, Windows XP e Windows 2000). L'interfaccia PoCallDriver è simile a quella di IoCallDriver, ad eccezione del fatto che il sottosistema di risparmio energia potrebbe ritardare l'IRP prima di passarlo al driver successivo. Ad esempio, i ritardi possono verificarsi in una richiesta PowerDeviceD0 se il dispositivo richiede inrush corrente e pertanto deve essere alimentato in modo seriale con un altro dispositivo di questo tipo.

Dopo che un driver riceve una richiesta di IRP_MN_SET_POWER in Windows Server 2003, Windows XP o 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_SET_POWER per gli stati di alimentazione del sistema

Solo il risparmio energia di sistema può inviare un IRP di alimentazione del sistema.

Un driver non deve avere esito negativo per impostare lo stato di alimentazione del sistema.

Quando possibile, il risparmio energia invia IRP_MN_QUERY_POWER prima di inviare IRP_MN_SET_POWER per richiedere uno stato di sospensione del sistema. Tuttavia, in alcune condizioni , ad esempio l'utente che preme il pulsante Di accensione o la scadenza di una batteria, il risparmio energia potrebbe emettere IRP_MN_SET_POWER senza prima eseguire query. Il risparmio energia esegue query solo per gli stati di sospensione; non esegue mai query prima di accendere.

La richiesta di IRP_MN_SET_POWER viene inviata al driver principale nello stack di dispositivi per un dispositivo. Il conducente superiore passa l'IRP verso il basso driver successivo e così via fino a quando l'IRP raggiunge il conducente dell'autobus, che deve completare l'IRP.

Un driver di filtro in genere non deve agire su un IRP di alimentazione del sistema, diverso da quello per passarlo.

Il proprietario dei criteri di risparmio energia del dispositivo imposta tuttavia una routine IoCompletion prima di passare l'IRP. Nella routine IoCompletion invia una richiesta di IRP_MN_SET_POWER per un IRP di alimentazione del dispositivo. Per altre informazioni, vedere Gestione di un Set-Power IRP di sistema in un proprietario di Criteri di risparmio energia del dispositivo.

Un IRP di alimentazione del sistema informa i driver che una modifica allo stato di alimentazione del sistema è imminente e i driver devono prepararsi per esso. Tuttavia, un driver non deve modificare lo stato di alimentazione del dispositivo fino a quando non riceve un IRP_MN_SET_POWER per uno stato di alimentazione del dispositivo .

Il valore in Parameters.Power.ShutdownType fornisce informazioni aggiuntive sulle azioni in sospeso. Quando L'IRP specifica PowerSystemShutdown (S5), un driver può determinare se il sistema sta reimpostando (PowerActionShutdownReset) o spegnendo a tempo indeterminato il riavvio in un secondo momento (PowerActionShutdownOff). Per i driver della maggior parte dei dispositivi, la differenza è inconsequential. Tuttavia, per determinati dispositivi, ad esempio i dispositivi di streaming video, un driver potrebbe spegnere il dispositivo per arrestare l'I/O quando il sistema viene reimpostato.

In Windows 2000 e versioni successive del sistema operativo, il valore in 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.

Stati di alimentazione del dispositivo

I driver di funzione e filtro che si trovano sopra un driver del bus non devono avere esito negativo per impostare uno stato di alimentazione del dispositivo. Il driver del bus può non riuscire una richiesta di accensione del dispositivo se il dispositivo viene rimosso o in fase di rimozione.

Un driver deve impostare il dispositivo nello stato richiesto prima di completare l'IRP.

Quando l'IRP richiede una transizione a uno stato di alimentazione inferiore, i driver devono gestire l'IRP mentre si sposta verso il basso lo stack di dispositivi, salvando qualsiasi contesto che il driver dovrà ripristinare lo stato di lavoro del dispositivo. Dopo che un autista riceve un IRP, l'autista:

  • Salva qualsiasi contesto che il driver dovrà ripristinare lo stato di lavoro del dispositivo.

  • Imposta il dispositivo sullo stato di alimentazione richiesto.

  • Chiama PoSetPowerState per inviare una notifica al risparmio energia.

  • Chiama PoStartNextPowerIrp per avviare l'IRP di alimentazione successiva (solo Windows Server 2003, Windows XP e Windows 2000).

  • Completa l'IRP di alimentazione del dispositivo.

Il driver deve completare l'IRP in modo tempestivo. In generale, i driver dovrebbero evitare qualsiasi ritardo che un utente tipico troverebbe notevolmente lento. Ad esempio, un driver potrebbe ritardare una modifica dello stato del sistema per scaricare i dati del disco o della rete memorizzati nella cache, ma non deve mantenere attiva una connessione di rete o formattare un nastro. Per altre informazioni, vedere Passaggio di power IRP.

In Windows 2000 e versioni successive del sistema operativo, se l'IRP specifica PowerDeviceD1, PowerDeviceD2 o PowerDeviceD3 e un IRP del set di sistema è attivo, il valore in Parameters.Power.ShutdownType fornisce informazioni sull'IRP di sistema.

I driver dei dispositivi nel percorso di ibernazione devono controllare questo valore. Se l'IRP richiede PowerDeviceD3 e ShutdownType è PowerActionHibernate, tale driver deve salvare qualsiasi contesto necessario per ripristinare il dispositivo, ma non deve spegnere il dispositivo; il dispositivo entrerà nello stato D3 quando la macchina perde l'alimentazione.

In Windows 2000 e versioni successive del sistema operativo, i driver non devono basarsi sul valore di ShutdownType se lo stato di alimentazione richiesto è PowerDeviceD0.

In Windows 98/Me, se l'IRP richiede uno stato di alimentazione del dispositivo, ShutdownType è sempre PowerActionNone.

Il driver che determina quando spegnere un dispositivo varia a seconda della classe del dispositivo.

Il driver che determina quando accendere un dispositivo è quasi sempre un driver che accede al dispositivo registrato. Il driver deve verificare che il dispositivo sia nello stato D0 prima di accedere ai registri hardware del dispositivo. Se il dispositivo non è nello stato D0, il driver deve chiamare PoRequestPowerIrp per inviare un IRP per accendere il dispositivo. Un driver non può accedere al dispositivo a meno che il dispositivo non si trova nello stato D0.

Quando un driver riceve un IRP per lo stato del dispositivo D0, imposta una routine IoCompletion e passa l'IRP al driver inferiore successivo.

Quando l'IRP raggiunge il driver del bus, tale driver applica (o reimposta) l'alimentazione al dispositivo, chiama PoStartNextPowerIrp (Solo Windows Server 2003, Windows XP e Windows 2000) e chiama PoSetPowerState per informare il risparmio energia del nuovo stato di alimentazione per il dispositivo.

Dopo che il driver dell'autobus ha completato l'IRP di alimentazione, i driver di funzione e filtro gestiscono l'IRP nelle routine IoCompletion durante il backup dello stack di dispositivi. Nella routine IoCompletion ogni driver ripristina o reinizializza il contesto di dispositivo ed esegue qualsiasi altra attività di avvio necessaria.

Per altre informazioni, vedere Gestione delle IRP_MN_SET_POWER per gli stati di alimentazione dei dispositivi.

Requisiti

Intestazione

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

Vedi anche

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

IRP_MN_SET_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT