Condividi tramite


Gestione degli IRP del dispositivo Power-Up

IRP di attivazione del dispositivo specificano IRP_MN_SET_POWER e uno stato di alimentazione del dispositivo che richiede più potenza rispetto allo stato attuale. In genere, un IRP di alimentazione specifica lo stato di funzionamento del dispositivo PowerDeviceD0.

Le richieste di accensione di un dispositivo devono essere gestite prima dal driver del bus sottostante per il dispositivo e quindi da ogni driver successivo che esegue il backup dello stack.

La figura seguente illustra i passaggi necessari per la gestione di un IRP power-up.

diagramma che illustra la gestione di una richiesta di risparmio energia del dispositivo.

Quando si gestisce una richiesta di IRP_MN_SET_POWER per l'alimentazione, un driver di funzione o filtro deve:

  • Chiamare IoAcquireRemoveLock per assicurarsi che il driver non riceva una richiesta di IRP_MN_REMOVE_DEVICE mentre gestisce l'IRP di riattivazione.

    Se IoAcquireRemoveLock restituisce uno stato di errore, il driver non deve continuare l'elaborazione dell'IRP. A partire da Windows Vista, invece, il driver deve chiamare IoCompleteRequest per completare l'IRP e quindi restituire lo stato di errore. In Windows Server 2003, Windows XP e Windows 2000, il driver deve chiamare IoCompleteRequest per completare l'IRP, quindi chiamare PoStartNextPowerIrp per avviare l'IRP di alimentazione successiva e quindi restituire lo stato di errore.

  • Chiamare IoMarkIrpPending per contrassegnare l'IRP in sospeso.

  • Chiamare IoCopyCurrentIrpStackLocationToNext per impostare la posizione dello stack IRP. Un driver non deve chiamare IoSkipCurrentIrpStackLocation se imposta una routine IoCompletion.

  • Chiamare IoSetCompletionRoutine per impostare una routine di attivazione IoCompletion.

    Quando si gestisce un IRP di alimentazione del dispositivo, il driver deve impostare una routine IoCompletion per ripristinare il contesto, rilasciare il blocco di rimozione ed eseguire altre attività necessarie dopo il completamento dell'IRP e quando il dispositivo si accende. Il driver non deve ripristinare il contesto prima del completamento dell'IRP. Per ulteriori informazioni, vedere Routine IoCompletion per IRP di alimentazione del dispositivo.

  • Chiamare IoCallDriver (in Windows 7 e Windows Vista) o PoCallDriver (Windows Server 2003, Windows XP e Windows 2000) per passare l'IRP al driver inferiore successivo. L'IRP deve attraversare l'intero stack di dispositivi fino al driver del bus. Solo il conducente dell'autobus è autorizzato a completare l'IRP.

  • Restituisce STATUS_PENDING.

Quando l'autista riceve l'IRP, deve prima verificare se il dispositivo è ancora presente e non sia stato rimosso o sostituito durante la sospensione. Se il dispositivo non è più presente, il driver del bus deve chiamare IoInvalidateDeviceRelations nel dispositivo padre per notificare al gestore Plug and Play che il dispositivo è scomparso. In questo caso, il conducente del bus può fallire l'inizializzazione del dispositivo IRP.

Se il dispositivo è ancora presente, il driver del bus esegue quindi le attività necessarie per ripristinare il dispositivo alla condizione operativa, chiama PoSetPowerState per informare il gestore dell'alimentazione del nuovo stato di alimentazione del dispositivo e completa l'IRP (IoCompleteRequest). Se i driver hanno accodato operazioni di I/O durante la sospensione del dispositivo o se il dispositivo richiede corrente di spunto, il driver del bus fornisce alimentazione al dispositivo. In caso contrario, il conducente del bus applica l'alimentazione non appena deve comunicare con il dispositivo.

Per un elenco delle procedure consigliate per ottenere tempi di avvio rapidi dagli stati di accensione, standby e ibernazione, vedere Miglioramento delle prestazioni di avvio del sistema.