Condividi tramite


Annullamento di un IRP di attesa/riattivazione

Solo il driver che ha inviato un IRP di attesa/riattivazione può annullare tale IRP.

Un driver potrebbe dover annullare un IRP di attesa/riattivazione in sospeso nelle circostanze seguenti:

  • Il driver riceve una richiesta PnP IRP_MN_STOP_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE o IRP_MN_SURPRISE_REMOVAL per il dispositivo. Il driver deve eseguire nuovamente l'IRP di attesa/riattivazione (PoRequestPowerIrp) dopo il riavvio del dispositivo.

  • Il sistema sta per essere in sospensione, ma il dispositivo non deve essere abilitato per riattivare il sistema.

    Ad esempio, il driver dell'hub USB potrebbe inviare una richiesta di IRP_MN_WAIT_WAKE all'avvio del dispositivo nel caso in cui in seguito inserisca uno dei dispositivi di input in uno stato di sospensione. Mentre il sistema si trova nello stato di lavoro, un segnale di riattivazione dal dispositivo restituisce il dispositivo allo stato di lavoro (ma non ha alcun effetto sullo stato di alimentazione del sistema). Quando il sistema si prepara per l'arresto, il driver dell'hub USB annulla questo IRP se il dispositivo non deve essere autorizzato a risvegliare il sistema.

  • Il sistema sta entrando in uno stato di sospensione da cui il dispositivo non può risvegliarlo. Vale a dire, sta immettendo uno stato meno alimentato rispetto al valore SystemWake specificato nella struttura DEVICE_CAPABILITIES .

  • Il dispositivo sta entrando in uno stato di alimentazione da cui non può rispondere a un segnale di riattivazione. Vale a dire, sta immettendo uno stato meno alimentato rispetto al valore DeviceWake specificato nella struttura DEVICE_CAPABILITIES .

Per annullare un'IRP di attesa/riattivazione, il driver che ha inviato l'IRP chiama IoCancelIrp, passando il puntatore all'IRP restituito in precedenza quando il driver ha chiamato PoRequestPowerIrp.

Un driver non deve annullare un IRP di attesa/riattivazione che non ha inviato.

Annulla routine per i runtime di integrazione di attesa/riattivazione

Molti driver di funzione e bus devono impostare Annulla routine per i runtime di attesa/riattivazione in sospeso; I tipi di driver seguenti devono impostare tali routine:

  • Driver che modificano le impostazioni del dispositivo per abilitare o disabilitare la riattivazione.

  • Driver che inviano richieste di IRP_MN_WAIT_WAKE ai driver dei dispositivi padre.

Una routine Annulla consente a un driver di disabilitare la riattivazione per il dispositivo e di pulire i dati correlati all'IRP di attesa/riattivazione in sospeso. I driver che richiedono runtime di integrazione di attesa/riattivazione per i dispositivi padre possono annullare anche i runtime di integrazione.

Nella routine cancel di attesa/riattivazione, un driver deve seguire questa procedura:

  1. Chiamare IoSetCancelRoutine per reimpostare la routine Cancel per IRP su NULL.

  2. Chiamare IoReleaseCancelSpinLock, passando cancelIRQL specificato in IRP per rilasciare il blocco di selezione di annullamento per L'IRP.

  3. Reimpostare tutti i campi pertinenti nell'estensione del dispositivo. Ad esempio, quando un IRP di attesa/riattivazione è in sospeso, la maggior parte dei driver imposta un flag e mantiene un puntatore all'IRP nell'estensione del dispositivo.

    Si noti che è possibile che un driver riceva un IRP di attesa/riattivazione mentre annulla un altro IRP di questo tipo. Il driver deve verificare se ha già un IRP in protezione del blocco spin (o il relativo equivalente). In tal caso, il driver deve sincronizzare attentamente la gestione per assicurarsi che annulla l'IRP corretto. Per altre informazioni sull'uso dei blocchi di selezione in Annulla routine, vedere Annullamento dei runtime di integrazione.

  4. Modificare le impostazioni del dispositivo necessarie. Ad esempio, un driver modem disabilita l'impostazione di riattivazione del dispositivo.

  5. Impostare Irp-IoStatus.Status> su STATUS_CANCELLED.

  6. Chiamare IoCompleteRequest per completare l'IRP di attesa/riattivazione, specificando IO_NO_INCREMENT.

  7. Se il driver ha richiesto in precedenza un IRP_MN_WAIT_WAKE correlato per un dispositivo padre, il driver deve annullare l'IRP dall'interno della routine Annulla . Il driver deve rilasciare il blocco di selezione annulla prima di annullare l'IRP dell'elemento padre.

    Ad esempio, un driver che funge da driver del bus per un dispositivo e possiede il driver dei criteri di alimentazione per il padre deve annullare un IRP di attesa/riattivazione correlato inviato in precedenza al padre. La chiamata a IoCancelIrp richiama la routine Cancel dell'elemento padre e così via nello stack di dispositivi.