Condividi tramite


Gestione dei runtime di integrazione dei Power-Up dei dispositivi

I runtime di integrazione di alimentazione del dispositivo specificano IRP_MN_SET_POWER e uno stato di alimentazione del dispositivo che richiede più alimentazione rispetto allo stato di alimentazione corrente del dispositivo. 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 di alimentazione.

diagramma che illustra la gestione di una richiesta di alimentazione del dispositivo.

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

  • Chiamare IoAcquireRemoveLock per assicurarsi che il driver non riceva una richiesta di 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 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 la successiva alimentazione IRP e quindi restituire lo stato di errore.

  • Chiamare IoMarkIrpPending per contrassegnare l'IRP in sospeso.

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

  • Chiamare IoSetCompletionRoutine per impostare una routine IoCompletion di alimentazione.

    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 il dispositivo attiva. Il driver non deve ripristinare il contesto prima del completamento dell'IRP. Per altre informazioni, vedere Routine IoCompletion per i runtime di integrazione di Power Power Per dispositivi.

  • Chiama 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 viaggiare fino allo stack di dispositivi fino all'autista dell'autobus. Solo il conducente dell'autobus è autorizzato a completare l'IRP.

  • Restituisce STATUS_PENDING.

Quando il conducente dell'autobus riceve l'IRP, deve prima verificare che il dispositivo sia 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 driver dell'autobus può avere esito negativo sul dispositivo power-up IRP.

Se il dispositivo è ancora presente, il driver del bus esegue quindi le attività necessarie per restituire il dispositivo a una condizione operativa, chiama PoSetPowerState per informare il gestore energia del nuovo stato di alimentazione del dispositivo e completa l'IRP (IoCompleteRequest). Se i driver hanno accodato I/O durante la sospensione del dispositivo o se il dispositivo richiede alimentazione inrush, il driver del bus applica alimentazione al dispositivo. In caso contrario, il conducente dell'autobus 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.