Condividi tramite


IRP_MN_SET_POWER

Questo IRP 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

Quando viene inviato

Il sistema power manager o il proprietario di criteri di risparmio energia del dispositivo possono inviare questo IRP.

Il risparmio energia 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, il risparmio energia invia questo IRP per modificare lo stato di alimentazione di un dispositivo inattivo.

Un driver proprietario di criteri di risparmio energia invia questo IRP per impostare lo stato di alimentazione del dispositivo per il dispositivo. Un driver deve chiamare PoRequestPowerIrp per 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. I driver in tali stack possono toccare il codice o i dati di paging per completare la richiesta.

Il power manager 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

Il membro Parameters.Power.Type specifica il tipo di stato di alimentazione impostato, Ovvero 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 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.For more information, see 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 di 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 dalla riattivazione dall'ibernazione.

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

Transizione stato Tipo di arresto SystemState corrente SystemState di destinazione Effective SystemState Commenti
Dormire fino a... S3 Dormire S0 S3 S3
... Svegliare S0 Dormire S3 S0 S0
Sospensione ibrida... S4 Metti in stato di ibernazione S0 S3 S4 Sospensione con file di ibernazione (Fast S4)
... Svegliare S0 Dormire S3 S0 S0
... Riattivazione/PwrLost S0 Dormire S4 S0 S0
Iberna a... S4 Metti in stato di ibernazione S0 S4 S4
... Svegliare S0 Dormire S4 S0 S0
Arresto ibrido in... S4 Metti in stato di ibernazione S0 S5 S4 App chiuse, l'utente si disconnesse come se l'arresto (avvio hiber)
... Avvio rapido S0 Dormire S4 S0 S0
Arresto in... 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 di stato di 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 alimentazione del dispositivo se il dispositivo viene rimosso o durante il processo 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 per ogni oggetto dispositivo.

Ogni driver deve passare ogni IRP di alimentazione verso il 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 l'alimentazione corrente e pertanto deve essere alimentato serialmente 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 del sistema può inviare un IRP di potenza 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 superiore nello stack di dispositivi per un dispositivo. Il conducente superiore passa l'IRP verso il basso successivo driver 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.

Tuttavia, il proprietario dei criteri di risparmio energia del dispositivo imposta 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 sistema Set-Power IRP 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 viene reimpostato (PowerActionShutdownReset) o spento a tempo indeterminato per 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.

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 alimentazione del dispositivo se il dispositivo viene rimosso o durante il processo 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 nello stack di dispositivi, salvando qualsiasi contesto che il driver dovrà ripristinare lo stato di lavoro del dispositivo. Dopo che un autista del bus riceve un IRP, il conducente:

  • 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 per l'alimentazione del dispositivo.

Il driver deve completare questo 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 di alimentazione del 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 entra 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 in 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 ai registri del dispositivo. 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 impostato 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) la potenza al dispositivo, chiama PoStartNextPowerIrp (Windows Server 2003, Windows XP e Windows 2000 solo) e chiama PoSetPowerState per informare il risparmio energia del nuovo stato di alimentazione per il dispositivo.

Dopo il completamento dell'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 richiesta.

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

Requisiti

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

Vedere anche

DEVICE_POWER_STATE

IoCallDriver

IRP_MN_QUERY_POWER

PoCallDriver

PoStartNextPowerIrp

PoSetPowerState

PoRequestPowerIrp

SYSTEM_POWER_STATE

SYSTEM_POWER_STATE_CONTEXT