Gestione di IRP_MN_SET_POWER per Gli stati di alimentazione dei dispositivi

Un set di dispositivi IRP richiede una modifica dello stato per un singolo dispositivo e viene inviato a tutti i driver nello stack per il dispositivo. Tale IRP specifica DevicePowerState nel membro Power.Type della posizione dello stack di I/O.

I driver gestiscono i irp di alimentazione mentre viaggiano verso il basso dello stack. Per gli IRP di alimentazione, i driver impostano le routine IoCompletion come irPs viaggiano verso il basso dello stack e quindi gestiscono gli INDIRIZZI di integrazione nelle routine IoCompletion come i irP viaggiano di nuovo nello stack. I driver in uno stack di dispositivi tipico gestiscono un'IRP di set-power del dispositivo come indicato di seguito:

  • La maggior parte dei driver di filtro deve semplicemente chiamare IoMarkIrpPending, passare l'IRP al driver inferiore successivo (vedere Passaggio di IRP di alimentazione) e restituire STATUS_PENDING dalla routine DispatchPower . Alcuni driver di filtro, tuttavia, potrebbero prima dover eseguire attività specifiche del dispositivo, ad esempio accodamento di IRP in ingresso o salvataggio dello stato di alimentazione del dispositivo.

  • Un driver di funzione chiama IoMarkIrpPending, esegue attività specifiche del dispositivo (ad esempio il completamento delle richieste di I/O in sospeso, accodamento delle richieste di I/O in ingresso, salvataggio del contesto del dispositivo o modifica della potenza del dispositivo), imposta una routine IoCompletion se necessario e passa l'IRP di alimentazione del dispositivo al driver inferiore successivo (vedere Passaggio di power IRP). Restituisce STATUS_PENDING dalla routine DispatchPower .

  • Il driver del bus modifica la potenza del dispositivo se è in grado di farlo e quindi chiama PoSetPowerState per inviare una notifica al gestore energia del nuovo dispositivo. In Windows Server 2003, Windows XP e Windows 2000 solo, il driver deve chiamare anche PoStartNextPowerIrp per avviare l'IRP di alimentazione successiva dopo aver impostato lo stato di alimentazione. Il driver completa quindi l'IRP, specificando IO_NO_INCREMENT. Se il driver non riesce a completare immediatamente l'IRP, chiama IoMarkIrpPending, restituisce STATUS_PENDING dalla routine DispatchPower e completa l'IRP in un secondo momento.

Anche se il dispositivo di destinazione è già nello stato di alimentazione richiesto, ogni driver di funzione o filtro deve passare l'IRP fino al driver inferiore successivo. Ogni IRP di potenza impostata deve viaggiare fino al basso dello stack di dispositivi al driver del bus, che lo completa.

Le funzioni e i driver di filtro che si trovano sopra un driver del bus non devono avere esito negativo in un set di dispositivi di alimentazione IRP. Il driver del bus può avere esito negativo su un'IRP del dispositivo se il dispositivo viene rimosso o nel processo di rimozione.

Ogni driver (funzione, filtro e driver bus) in uno stack di driver deve chiamare PoSetPowerState per informare il power manager di una modifica dello stato di alimentazione del relativo oggetto dispositivo corrispondente.

Analogamente ad altre attività driver associate all'alimentazione e all'alimentazione del dispositivo, la chiamata a PoSetPowerState deve verificarsi dopo che il dispositivo viene attivato (se il nuovo stato è D0) o prima che il dispositivo venga disattivato (se il nuovo stato è qualsiasi altro stato).

Ogni driver deve tenere traccia dello stato di alimentazione del dispositivo. Il power manager non fornisce queste informazioni ai driver.

Durante la gestione di una richiesta di IRP_MN_SET_POWER per uno stato di alimentazione del dispositivo, un driver deve tornare dalla routine DispatchPower il più rapidamente possibile. Un driver non deve attendere la routine DispatchPower per un evento kernel segnalato dal codice che gestisce la stessa IRP. Poiché gli IRP di alimentazione vengono sincronizzati in tutto il sistema, potrebbe verificarsi un deadlock.

Per garantire il livello massimo di prestazioni del sistema, soprattutto per le applicazioni multimediali, un driver deve eseguire operazioni che richiedono tempo a un livello di richiesta di interruzione (IRQL) uguale a PASSIVE_LEVEL. Per eseguire operazioni in IRQL= PASSIVE_LEVEL, un driver può usare un thread dedicato o un thread di lavoro di sistema. Per linee guida sull'ottimizzazione delle prestazioni dei driver per le piattaforme multimediali, vedere la Guida alla progettazione dei dispositivi multimediali di streaming.

I passaggi esatti che un driver deve eseguire per gestire un'IRP di alimentazione dipende dal fatto che il dispositivo stia caricando o giù, come descritto nelle sezioni seguenti:

Gestione di irP Power-Down dispositivo

Gestione di irP Power-Up dispositivo