Condividi tramite


Invio di un dispositivo Set-Power IRP in risposta a un Set-Power IRP di sistema

The device power policy owner should take the following steps to respond to a system set-power IRP:

  1. Chiamare IoAcquireRemoveLock, passando l'IRP corrente come parametro Tag, per assicurarsi che il driver non riceva una richiesta Plug and Play IRP_MN_REMOVE_DEVICE 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 la richiesta e quindi restituire lo stato di errore. In Windows Server 2003, Windows XP e Windows 2000, il driver deve prima chiamare PoStartNextPowerIrp, chiamare IoCompleteRequest per completare l'IRP e quindi restituire lo stato di errore.

  2. Configurare il percorso dello stack IRP per il driver successivo inferiore chiamando IoCopyCurrentIrpStackLocationToNext.

  3. Impostare una routine IoCompletion nel set-power IRP di sistema.

  4. Chiamare IoMarkIrpPending per contrassegnare l'IRP di alimentazione del sistema come in sospeso.

  5. Chiama IoCallDriver (a partire da Windows Vista) o PoCallDriver (in Windows Server 2003, Windows XP e Windows 2000) per passare l'IRP di alimentazione del sistema al driver inferiore successivo.

  6. Restituisce STATUS_PENDING dalla routine DispatchPower .

Nella routine IoCompletion (vedere il passaggio 3 nell'elenco precedente), il proprietario dei criteri di risparmio energia del dispositivo invia un IRP di alimentazione del dispositivo come indicato di seguito:

  1. Esaminare l'IRP di alimentazione del sistema per ottenere lo stato di alimentazione del sistema richiesto. Scegliere uno stato di alimentazione del dispositivo appropriato per lo stato di alimentazione del sistema. Per altre informazioni, vedere Determinazione dello stato di alimentazione del dispositivo corretto.

  2. Chiamare PoRequestPowerIrp per inviare un IRP_MN_SET_POWER per lo stato di alimentazione del dispositivo determinato nel passaggio 1. Il proprietario dei criteri di alimentazione deve inviare la richiesta di risparmio energia del set di dispositivi anche se il dispositivo è già in tale stato.

  3. Specificare una routine di callback di completamento alimentazione (CompletionFunction) nella chiamata a PoRequestPowerIrp e passare l'IRP di alimentazione del sistema nel buffer di contesto .

  4. Restituisce STATUS_MORE_PROCESSING_REQUIRED dalla routine IoCompletion , in modo che il driver possa completare l'elaborazione dell'IRP del set di alimentazione nella routine di callback di power-completion.

Tenere presente che il proprietario dei criteri di risparmio energia del dispositivo non solo invia l'IRP del set di dispositivi, ma deve anche gestire questo IRP durante lo spostamento nello stack di dispositivi. Di conseguenza, un proprietario dei criteri di risparmio energia del dispositivo potrebbe avere non solo una routine di callback di completamento alimentazione associata all'IRP del set di dispositivi e a una routine IoCompletion per l'IRP del set di sistema, ma anche una routine IoCompletion per l'IRP del set di dispositivi. Per altre informazioni, vedere Gestione dei IRP_MN_SET_POWER per gli stati di alimentazione dei dispositivi.

Dopo che il gestore di I/O chiama tutte le routine IoCompletion impostate come IRP per il set di dispositivi, il gestore di I/O chiama la routine di callback di completamento del risparmio energia. A questo scopo, tutti i driver nello stack hanno completato l'IRP per il set di dispositivi e la transizione della potenza del dispositivo è stata completata.

La routine di callback di completamento dell'alimentazione deve eseguire le operazioni seguenti:

  1. Chiamare PoStartNextPowerIrp per avviare l'IRP di alimentazione successiva. (Solo Windows Server 2003, Windows XP e Windows 2000).

  2. Completare il set-power IRP di sistema (IoCompleteRequest) con lo stato restituito per l'IRP del set di dispositivi.

  3. Chiama IoReleaseRemoveLock per liberare il blocco acquisito in precedenza.

  4. Restituisce lo stato con cui sono stati completati i runtime di integrazione di set-power.