Routine DispatchPower
La routine DispatchPower di un driver supporta la gestione delle energia gestendo gli indirizzi IP per il IRP_MJ_POWER codice di funzione I/O. Associato al codice della funzione IRP_MJ_POWER sono diversi codici di funzione I/O secondari per Power Management. Il power manager usa questi codici di funzione secondari per indirizzare i driver a modificare gli stati di alimentazione, attendere e rispondere agli eventi di riattivazione del sistema e per eseguire query sui driver sui propri dispositivi.
La routine DispatchPower di ogni driver esegue le attività seguenti:
Gestire se possibile l'IRP.
Passare l'IRP al driver inferiore successivo nello stack di dispositivi usando PoCallDriver.
Se un driver del bus, eseguire l'operazione di alimentazione richiesta nel dispositivo e completare l'IRP.
Tutti i driver per un dispositivo devono avere l'opportunità di gestire gli IRP di alimentazione per il dispositivo, ad eccezione di alcuni casi in cui un driver di funzione o filtro è autorizzato a eseguire il failover dell'IRP. La maggior parte dei driver di funzione e filtro esegue un'elaborazione o imposta una routine IoCompletion per ogni IRP di alimentazione, quindi passa l'IRP fino al driver inferiore successivo senza completarlo. Alla fine l'IRP raggiunge il driver del bus, che modifica fisicamente lo stato di alimentazione del dispositivo se necessario e completa l'IRP.
Al termine dell'IRP, il gestore I/O chiama le routine IoCompletion impostate dai driver come IRP ha viaggiato verso il basso dello stack di dispositivi. Se un driver deve impostare una routine di completamento dipende dal tipo di IRP e dai singoli requisiti del driver.
Power IRP che carica un dispositivo deve essere gestito prima dal driver più basso nello stack di dispositivi (il driver del bus sottostante) e quindi da ogni driver successivo fino allo stack. Power IRP che carica un dispositivo deve essere gestito prima dal driver nella parte superiore dello stack di dispositivi e quindi da ogni driver successivo che scende lo stack.
Gestione speciale per i dispositivi rimovibili
Nelle routine DispatchPower i driver dei dispositivi rimovibili devono verificare se il dispositivo è ancora presente. Se il dispositivo è stato rimosso, il driver non deve passare l'IRP fino al driver inferiore successivo. Il driver deve invece eseguire le operazioni seguenti:
Chiamare PoStartNextPowerIrp per iniziare a elaborare l'IRP di alimentazione successiva.
Impostare Irp-IoStatus.Status> su STATUS_DELETE_PENDING.
Chiamare IoCompleteRequest, specificando IO_NO_INCREMENT, per completare l'IRP.
Restituire STATUS_DELETE_PENDING.