Gestione dei runtime di integrazione dei Power-Down dei dispositivi
Un dispositivo power-down IRP specifica il codice di funzione secondario IRP_MN_SET_POWER e uno stato di alimentazione del dispositivo (PowerDeviceD0, PowerDeviceD1, PowerDeviceD2 o PowerDeviceD3) meno alimentato o uguale allo stato di alimentazione corrente del dispositivo. I driver devono gestire l'IRP di alimentazione quando l'IRP si sposta verso il basso nello stack di dispositivi. I driver di livello superiore devono gestire l'IRP prima che i driver di livello inferiore. I driver che non hanno attività specifiche del dispositivo da eseguire devono passare tempestivamente l'IRP al driver successivo inferiore.
La figura seguente illustra i passaggi necessari per la gestione di tali IRP.
Se L'IRP specifica PowerDeviceD3, il driver di funzione deve in genere eseguire le attività seguenti:
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 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.
Eseguire tutte le attività specifiche del dispositivo che devono essere eseguite prima della rimozione dell'alimentazione del dispositivo, ad esempio la chiusura del dispositivo, il completamento o lo scaricamento di eventuali operazioni di I/O in sospeso, la disabilitazione di interrupt, l'accodamento dei runtime di integrazione in ingresso successivi e il salvataggio del contesto di dispositivo da cui ripristinare o reinizializzare il dispositivo.
Il driver non deve causare un lungo ritardo (ad esempio, un ritardo che un utente potrebbe trovare irragionevole per questo tipo di dispositivo) durante la gestione dell'IRP.
Il driver deve accodare tutte le richieste di I/O in ingresso fino a quando il dispositivo non torna allo stato di lavoro.
È possibile controllare il valore in Parameters.Power.ShutdownType. Se un IRP di alimentazione del sistema è attivo, ShutdownType fornisce informazioni sull'IRP di sistema. Per altre informazioni su questo valore, vedere System Power Actions.For more information about this value, see System Power Actions.
I driver dei dispositivi nel percorso di ibernazione devono controllare questo valore. Se ShutdownType è PowerActionHibernate, il driver deve salvare qualsiasi contesto necessario per ripristinare il dispositivo, ma non deve spegnere il dispositivo.
Modificare lo stato di alimentazione fisica del dispositivo se il driver è in grado di farlo e se la modifica è appropriata.
Chiamare PoSetPowerState per notificare al risparmio energia il nuovo stato di alimentazione del dispositivo.
Chiamare IoCopyCurrentIrpStackLocationToNext per configurare la posizione dello stack per il driver inferiore successivo.
Impostare una routine IoCompletion che chiama PoStartNextPowerIrp che indica che il driver è pronto per gestire l'IRP di alimentazione successiva. Questo passaggio non è obbligatorio in Windows 7 e Windows Vista.
Chiama IoCallDriver (in Windows 7 e Windows Vista) o chiama PoCallDriver (in Windows Server 2003, Windows XP e Windows 2000) per passare l'IRP al driver inferiore successivo. L'IRP deve essere passato fino al conducente dell'autobus, che completa l'IRP.
Chiama IoReleaseRemoveLock per rilasciare il blocco acquisito in precedenza.
Restituisce STATUS_PENDING.
I driver devono salvare tutte le informazioni sul contesto del dispositivo e impostare il nuovo stato di alimentazione prima di inoltrare il provider di risorse. Le informazioni sul contesto devono contenere almeno il nuovo stato di alimentazione richiesto. Deve includere anche eventuali informazioni aggiuntive necessarie per l'accensione del driver. Dopo aver completato l'IRP e aver spento il dispositivo, il driver non può più accedere al dispositivo e al contesto di dispositivo non è disponibile.
Ogni driver deve passare l'IRP al driver inferiore successivo. Quando l'IRP raggiunge il conducente dell'autobus, il conducente del bus spegne il dispositivo (se è in grado di farlo), chiama PoSetPowerState per informare il risparmio energia e completa l'IRP.
Tuttavia, se il driver del bus esegue il servizio di ibernazione del dispositivo, deve verificare se il valore di ShutdownType in IRP è PowerSystemHibernate. In tal caso, il driver del bus deve chiamare PoSetPowerState per segnalare PowerDeviceD3, ma non deve spegnere il dispositivo. Il dispositivo verrà spento dopo il salvataggio del file di ibernazione, insieme al resto del sistema.
Dopo l'accensione di tutti i dispositivi figlio, anche un conducente dell'autobus potrebbe scegliere di spegnere il bus. Questo comportamento dipende dal dispositivo.
Se L'IRP specifica qualsiasi altro stato (D0, D1 o D2), le azioni del driver necessarie dipendono dal dispositivo. In genere, i dispositivi che supportano questi stati possono tornare rapidamente allo stato di lavoro quando arriva una richiesta di I/O. Un driver per tale dispositivo deve completare tutte le richieste di I/O in sospeso, accodare le nuove richieste e salvare tutto il contesto necessario prima di inoltrare l'IRP al driver inferiore successivo. Quando l'IRP raggiunge il driver dell'autobus, imposta l'hardware nello stato richiesto. Un driver non può accedere al dispositivo mentre è in stato di sospensione.
In alcune circostanze, un driver di funzione o filtro potrebbe ricevere un IRP di alimentazione del dispositivo specificando PowerDeviceD0 quando il dispositivo si trova già nello stato D0. Il driver deve gestire questo IRP come qualsiasi altro IRP di potenza del set: completare le richieste di I/O in sospeso, accodare le richieste di I/O in ingresso, impostare una routine IoCompletion e passare l'IRP al driver inferiore successivo. Un driver non deve tuttavia modificare le impostazioni hardware del dispositivo. Quando il conducente dell'autobus riceve l'IRP, dovrebbe semplicemente completare l'IRP. Al termine dell'IRP, i driver di funzione e filtro possono gestire qualsiasi richiesta in coda. L'accodamento di I/O fino al completamento dell'IRP elimina qualsiasi possibilità di un numero inferiore di driver che tentano di modificare i registri dei dispositivi mentre un driver più elevato tenta di eseguire operazioni di I/O.