IRP_MN_WAIT_WAKE

Questo IRP consente a un driver di risvegliare un sistema di sospensione o di risvegliare un dispositivo in sospensione.

Codice principale

IRP_MJ_POWER

Data di invio

Un driver proprietario dei criteri di alimentazione è destinato a questo IRP al proprio PDO per consentire al dispositivo di riattivarsi in risposta a un evento esterno, ad esempio una chiamata telefonica in arrivo. Un driver deve chiamare PoRequestPowerIrp per inviare questo IRP.

Come regola generale, un driver deve inviare questo IRP non appena determina che il dispositivo deve essere abilitato per la riattivazione. Di conseguenza, i driver per la maggior parte di tali dispositivi inviano questo IRP dopo l'accensione dei dispositivi e prima di completare la richiesta di IRP_MN_START_DEVICE .

Tuttavia, un driver può inviare l'IRP ogni volta che il dispositivo si trova nello stato di lavoro (PowerDeviceD0). Lo stack di dispositivi non deve essere in transizione; ovvero, un driver non deve inviare un IRP_MN_WAIT_WAKE mentre qualsiasi altro IRP di alimentazione è attivo nello stack di dispositivi.

Un IRP di attesa/riattivazione non modifica lo stato di alimentazione del dispositivo o del sistema. Abilita semplicemente un segnale di riattivazione dal dispositivo. Quando arriva il segnale di riattivazione, il proprietario del criterio deve chiamare PoRequestPowerIrp per inviare un IRP di alimentazione impostata per restituire il dispositivo a D0.

Il driver deve essere in esecuzione in IRQL = PASSIVE_LEVEL per inviare questo IRP. Tuttavia, l'IRP può essere completato in IRQL = DISPATCH_LEVEL.

Parametri di input

Parameters.WaitWake.PowerState contiene lo stato di alimentazione del sistema minimo (meno alimentato) da cui il dispositivo deve essere autorizzato a risvegliare il sistema.

Parametri di output

Nessuno.

Blocco dello stato I/O

Un driver imposta Irp-IoStatus.Status> su uno dei seguenti:

STATUS_PENDING
Il driver ha ricevuto l'IRP ed è in attesa che il dispositivo segnali la riattivazione.

STATUS_INVALID_DEVICE_STATE
Il dispositivo è in uno stato meno alimentato rispetto allo stato DeviceWake specificato nella struttura DEVICE_CAPABILITIES per il dispositivo oppure il dispositivo non può risvegliare il sistema dallo stato SystemWake passato nell'IRP.

STATUS_NOT_SUPPORTED
Il dispositivo non supporta la riattivazione.

STATUS_DEVICE_BUSY
Una richiesta di IRP_MN_WAIT_WAKE è già in sospeso e deve essere completata o annullata prima di poter eseguire un'altra richiesta di IRP_MN_WAIT_WAKE.

STATUS_SUCCESS
Il dispositivo ha segnalato un evento di riattivazione.

STATUS_CANCELLED
L'IRP è stato annullato.

Se un driver deve avere esito negativo su questo IRP, completa immediatamente l'IRP e non passa l'IRP al driver inferiore successivo.

Operazione

Un driver invia IRP_MN_WAIT_WAKE per uno dei due motivi seguenti:

  1. Per consentire al dispositivo di riattivare un sistema di sospensione in risposta a un segnale di riattivazione esterno.

  2. Per abilitare il risveglio del dispositivo dallo stato di sospensione del dispositivo in risposta a un segnale di riattivazione esterno.

L'IRP deve essere passato allo stack di dispositivi al driver del bus per il dispositivo, che chiama IoMarkIrpPending e restituisce STATUS_PENDING dalla routine DispatchPower . L'IRP rimane in sospeso fino a quando non si verifica un segnale di riattivazione o fino a quando il driver che ha inviato l'IRP lo annulla.

È possibile tenere in sospeso un solo IRP di attesa/riattivazione per un PDO in qualsiasi momento. Se un driver contiene già un IRP di attesa/riattivazione per un PDO, deve avere esito negativo per eventuali provider di integrazione aggiuntivi con STATUS_DEVICE_BUSY. Un driver che enumera più pdo figlio può avere un IRP di attesa/riattivazione in sospeso per ogni PDO di questo tipo.

Ogni driver imposta una routine IoCompletion quando l'IRP si sposta verso il basso nello stack di dispositivi. Quando il dispositivo segnala un evento di riattivazione, il conducente del bus esegue il segnale di riattivazione e completa l'IRP, restituendo STATUS_SUCCESS. Il gestore di I/O chiama quindi la routine IoCompletion del driver superiore successivo e così via nello stack di dispositivi.

Quando un driver invia un IRP di attesa/riattivazione, deve specificare una routine di callback nella chiamata PoRequestPowerIrp . Nella routine di callback, il driver in genere servizi il dispositivo. Ad esempio, il proprietario dei criteri di alimentazione per il dispositivo deve chiamare PoRequestPowerIrp per inviare un IRP_MN_SET_POWER per lo stato del dispositivo D0.

Un driver che funge da driver del bus per un dispositivo e il proprietario dei criteri per un dispositivo padre richiede un IRP IRP_MN_WAIT_WAKE per lo stack di dispositivi padre quando riceve una richiesta di IRP_MN_WAIT_WAKE da un PDO figlio. Se il driver enumera più pdo figlio, deve richiedere un solo IRP di attesa/riattivazione per lo stack di dispositivi padre, indipendentemente dal numero di PDO figlio che inviano richieste di attesa/riattivazione. Un driver di questo tipo deve invece mantenere un conteggio interno dei runtime di integrazione di attesa/riattivazione, incrementando il conteggio ogni volta che riceve una richiesta e decrementando il conteggio ogni volta che completa una richiesta. Se il conteggio è diverso da zero dopo il completamento di un IRP di attesa/riattivazione, il driver deve inviare un altro IRP di attesa/riattivazione allo stack di dispositivi a "riprovare" per la riattivazione. Per altre informazioni, vedere Understanding the Path of Wait/Wake IRPs through a Device Tree.For more information, see Understanding the Path of Wait/Wake IRPs through a Device Tree.

Per annullare un IRP_MN_WAIT_WAKE, un driver chiama IoCancelIrp. Solo il driver che ha originato l'IRP può annullarlo. Un driver annulla un IRP_MN_WAIT_WAKE in sospeso quando si verifica una delle condizioni seguenti:

  • Il driver riceve un IRP PnP che arresta o rimuove il dispositivo.

  • Il sistema sta per dormire e il segnale di riattivazione del dispositivo non deve risvegliarlo.

Requisiti

Intestazione

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

Vedi anche

PoRequestPowerIrp