Gestione di un IRP di attesa/riattivazione in un driver del bus (PDO)
Analogamente ad altri IRP di alimentazione, ogni IRP di attesa/riattivazione deve essere passato fino allo stack di dispositivi al driver del bus (PDO), che è responsabile del completamento dell'IRP. Al momento della ricezione dell'IRP, l'autista del bus può non riuscire immediatamente o tenerlo in sospeso per il completamento successivo. Di seguito sono riportati i passaggi che il conducente dell'autobus deve eseguire:
Esaminare il valore in Irp-Parameters.WaitWake.PowerState>. Se il dispositivo supporta la riattivazione, ma non dallo stato systemWake specificato o meno dallo stato di alimentazione del dispositivo corrente, il driver deve non riuscire il protocollo IRP come indicato di seguito:
Impostare STATUS_INVALID_DEVICE_STATE in Irp-IoStatus.Status>.
Completare l'IRP (IoCompleteRequest), specificando un boost di priorità di IO_NO_INCREMENT.
Restituisce il set di stato in Irp-IoStatus.Status> dalla routine DispatchPower.
Controllare se un IRP di attesa/riattivazione è già in sospeso per il PDO. In tal caso, impostare Irp-IoStatus.Status> su STATUS_DEVICE_BUSY, incrementare il conteggio interno dei runtime di integrazione di attesa/riattivazione del driver e completare l'IRP come descritto nel passaggio precedente.
Un solo IRP di attesa/riattivazione può essere in sospeso per un PDO.
Se il dispositivo supporta la riattivazione dallo stato di alimentazione del sistema specificato e non è già in sospeso l'IRP di attesa/riattivazione, chiamare IoMarkIrpPending per indicare al gestore di I/O che l'IRP verrà completato o annullato in un secondo momento. Non impostare una routine IoCompletion .
Impostare l'hardware del dispositivo per abilitare la riattivazione.
Il meccanismo specifico in base al quale un driver del bus abilita l'hardware per la riattivazione è dipendente dal dispositivo. Per un dispositivo PCI, Pci.sys è responsabile dell'impostazione del bit di abilitazione pme perché questo driver è proprietario del registro PME. Per altri dispositivi, vedere la documentazione specifica della classe del dispositivo.
Se il PDO è l'elemento figlio di un fdO, richiedere un IRP di attesa/riattivazione per l'oggetto FDO, assicurandosi di impostare una routine Annulla per l'IRP corrente ,ovvero l'IRP che contiene in sospeso. Non tentare di passare o riutilizzare l'IRP corrente.
Restituisce STATUS_PENDING dalla routine DispatchPower .
Quando arriva un segnale di riattivazione, chiama IoCompleteRequest per completare l'IRP di attesa/riattivazione in sospeso, impostando Irp-IoStatus.Status su STATUS_SUCCESS e specificando un boost di priorità di IO_NO_INCREMENT.
Nota
Durante la rimozione del dispositivo, in genere il proprietario dei criteri di alimentazione (PPO) deve aver annullato l'IRP di attesa. Tuttavia, nel caso in cui PPO non lo faccia, come meccanismo di resilienza è consigliabile che il PDO del bus completi l'IRP con uno stato di errore. Il PDO dell'autobus deve eseguire questa operazione quando si gestiscono sia IRP_MN_SURPRISE_REMOVE che IRP_MN_REMOVE_DEVICE.
Per i dispositivi che non supportano Wake-Up
Se il dispositivo non supporta la riattivazione, il driver dell'autobus (PDO) deve procedere come segue:
Completare l'IRP di attesa/riattivazione chiamando IoCompleteRequest, specificando IO_NO_INCREMENT.
Restituire dalla routine DispatchPower , passando il valore in Irp-IoStatus.Status> come valore restituito .