Gestione di un Query-Power IRP di sistema in un proprietario di Criteri di risparmio energia dispositivo
Quando un proprietario di criteri di risparmio energia del dispositivo riceve un IRP_MN_QUERY_POWER per uno stato di alimentazione del sistema, risponde passando la query e, in una routine IoCompletion , inviando un IRP_MN_QUERY_POWER per uno stato di alimentazione del dispositivo. Quando tutti i driver nello stack hanno completato la query sul dispositivo, il proprietario dei criteri di risparmio energia del dispositivo completa la query di sistema.
Un proprietario dei criteri di risparmio energia del dispositivo deve eseguire i passaggi seguenti nella routine DispatchPower per rispondere a una query di sistema:
Chiamare IoAcquireRemoveLock, passando l'IRP corrente, per assicurarsi che il driver non riceva una richiesta di IRP_MN_REMOVE_DEVICE PnP durante la gestione dell'IRP di alimentazione.
Se IoAcquireRemoveLock restituisce uno stato di errore, il driver non deve continuare l'elaborazione di IRP. A partire da Windows Vista, invece, il driver deve chiamare IoCompleteRequest per completare l'IRP e restituire lo stato di errore. In Windows Server 2003, Windows XP e Windows 2000, il driver deve chiamare PoStartNextPowerIrp, chiamare IoCompleteRequest per completare l'IRP e restituire lo stato di errore.
Assicurarsi che il driver possa supportare lo stato di alimentazione del sistema sottoposto a query, come descritto in Errore di un sistema Query-Power IRP in un filtro o in un driver di funzione. In caso contrario, completare l'IRP con uno stato di errore, come descritto in tale sezione.
Tuttavia, un driver non deve eseguire una query per S4 (PowerSystemHibernate) se il dispositivo è abilitato per la riattivazione, ma non può riattivare il sistema dallo stato di ibernazione. In questo caso, il proprietario dei criteri di alimentazione per il driver (che ha inviato il IRP_MN_WAIT_WAKE) deve annullare l'IRP di attesa/riattivazione ed eseguire la query di sistema. Per altre informazioni, vedere Annullamento di un IRP di attesa/riattivazione.
Se il driver può supportare lo stato di alimentazione del sistema sottoposto a query, chiamare IoMarkIrpPending.
Configurare il percorso dello stack IRP per il driver successivo inferiore chiamando IoCopyCurrentIrpStackLocationToNext.
Impostare una routine IoCompletion nella query di sistema power IRP.
Chiama IoCallDriver (in Windows 7 e Windows Vista) o PoCallDriver (in Windows Server 2003, Windows XP e Windows 2000), per passare l'IRP al driver inferiore successivo.
Restituisce STATUS_PENDING.
La routine IoCompletion deve eseguire le operazioni seguenti:
Controllare Irp-IoStatus.Status> per assicurarsi che i driver inferiori abbiano completato correttamente l'IRP. Se un driver inferiore ha specificato un valore NTSTATUS non riuscito, la routine IoCompletion deve restituire il valore NTSTATUS.
Se i driver inferiori hanno completato correttamente l'IRP, chiamare PoRequestPowerIrp per inviare un IRP di query del dispositivo per uno stato di alimentazione del dispositivo valido per lo stato di alimentazione del sistema sottoposto a query. Se necessario, consultare la matrice DEVICE_STATE nella struttura DEVICE_CAPABILITIES per determinare quali stati di alimentazione del dispositivo sono validi per lo stato di alimentazione del sistema sottoposto a query.
Specificare una routine di callback (parametro CompletionFunction ) nella chiamata a PoRequestPowerIrp e passare l'IRP di sistema nell'area Contesto .
Restituisce STATUS_MORE_PROCESSING_REQUIRED in modo che il driver possa completare l'elaborazione dell'IRP della query di sistema nella routine di callback.
Dopo aver completato l'IRP e aver eseguito tutte le routine IoCompletion impostate durante l'elaborazione di IRP, il risparmio energia tramite il gestore di I/O chiama la routine di callback del gestore di Power Policy (il parametro CompletionFunction su PoRequestPowerIrp). La routine di callback, a sua volta, deve eseguire le operazioni seguenti:
Chiamare PoStartNextPowerIrp per avviare l'IRP di alimentazione successiva. (Solo Windows Server 2003, Windows XP e Windows 2000).
Completare l'IRP di query di sistema (chiamare IoCompleteRequest) con lo stato restituito per l'IRP di query del dispositivo.
Chiama IoReleaseRemoveLock per liberare il blocco acquisito in precedenza.
Tenere presente che il proprietario dei criteri di risparmio energia del dispositivo non solo invia la query del dispositivo, ma deve anche gestirla nello stack di dispositivi. Per altre informazioni, vedere Gestione dei IRP_MN_QUERY_POWER per gli stati di alimentazione dei dispositivi.