Share via


Invio di IRP_MN_QUERY_POWER o IRP_MN_SET_POWER per gli stati di alimentazione del dispositivo

Un proprietario dei criteri di risparmio energia del dispositivo invia un IRP (IRP_MN_QUERY_POWER) di query per il dispositivo per determinare se i driver più bassi possono contenere una modifica dello stato di alimentazione del dispositivo e un IRP (IRP_MN_SET_POWER) del set di dispositivi per modificare lo stato di alimentazione del dispositivo. Questo driver può anche inviare un IRP di attesa/riattivazione per consentire al dispositivo di riattivarsi in risposta a un segnale esterno. Per informazioni dettagliate, vedere Dispositivi di supporto con funzionalità di Wake-Up .

Il driver deve inviare una richiesta di IRP_MN_QUERY_POWER quando viene soddisfatta una delle condizioni seguenti:

  • Il driver riceve un IRP di power query di sistema.

  • Il driver si sta preparando per mettere un dispositivo inattivo in uno stato di sospensione, quindi è necessario eseguire una query sui driver inferiori per determinare se è possibile farlo.

Il driver deve inviare una richiesta di IRP_MN_SET_POWER quando viene soddisfatta una delle condizioni seguenti:

  • Il driver ha determinato che il dispositivo è inattivo e può essere messo in sospensione.

  • Il dispositivo è in sospensione e deve immettere nuovamente lo stato di lavoro per gestire l'I/O in attesa.

  • Il driver riceve un IRP di alimentazione del sistema.

Un driver non deve allocare il proprio IRP di alimentazione; Il risparmio energia fornisce la routine PoRequestPowerIrp a questo scopo. Come spiegano le regole per la gestione dei runtime di integrazione di Power, PoRequestPowerIrp alloca e invia l'IRP e in combinazione con IoCallDriver (in Windows 7 e Windows Vista) o PoCallDriver (in Windows Server 2003, Windows XP e Windows 2000), garantisce che tutte le richieste di alimentazione siano sincronizzate correttamente. I chiamanti di PoRequestPowerIrp devono essere in esecuzione in IRQL <= DISPATCH_LEVEL.

Di seguito è riportato il prototipo per questa routine:

NTSTATUS
PoRequestPowerIrp (
    IN PDEVICE_OBJECT DeviceObject,
    IN UCHAR MinorFunction,
    IN POWER_STATE PowerState,
    IN PREQUEST_POWER_COMPLETE CompletionFunction,
    IN PVOID Context,
    OUT PIRP *Irp OPTIONAL
    );

Per inviare l'IRP, il driver chiama PoRequestPowerIrp, specificando un puntatore all'oggetto dispositivo di destinazione in DeviceObject, il codice IRP secondario IRP_MN_SET_POWER o IRP_MN_QUERY_POWER in MinorFunction, il valore DevicePowerState in PowerState. Digitare e uno stato di alimentazione del dispositivo in PowerState. Stato. In Windows 98/Me DeviceObject deve specificare il PDO del dispositivo sottostante; in Windows 2000 e versioni successive di Windows, questo valore può puntare al PDO o a un fdO di un driver nello stesso stack di dispositivi.

Se il driver deve eseguire attività aggiuntive dopo che tutti gli altri driver hanno completato l'IRP, deve passare un puntatore a una funzione di completamento alimentazione in CompletionFunction. Il gestore di I/O chiama CompletionFunction dopo aver chiamato tutte le routine IoCompletion impostate dai driver durante il passaggio dell'IRP nello stack.

Ogni volta che un proprietario dei criteri di risparmio energia del dispositivo invia un IRP di power query per il dispositivo, deve successivamente inviare un IRP di alimentazione del dispositivo dalla routine di callback (CompletionFunction) specificata nella chiamata a PoRequestPowerIrp. Se la query ha avuto esito positivo, il set-power IRP specifica lo stato di alimentazione sottoposto a query. Se la query non è riuscita, l'IRP di set-power esegue nuovamente l'asserzione dello stato di alimentazione corrente del dispositivo. La ripetizione dell'asserzione dello stato corrente è importante perché le operazioni di I/O della coda dei driver in risposta alla query; Il proprietario dei criteri deve inviare il protocollo IRP di impostazione per notificare ai driver nello stack di dispositivi per avviare l'elaborazione delle richieste di I/O in coda.

Tenere presente che il proprietario dei criteri per un dispositivo non solo invia l'IRP di alimentazione del dispositivo, ma gestisce anche l'IRP man mano che viene passato allo stack di dispositivi. Di conseguenza, un driver di questo tipo imposta spesso una routine IoCompletion (con IoSetCompletionRoutine) come parte del codice di gestione di IRP, in particolare quando il dispositivo viene alimentato. La routine IoCompletion viene chiamata in sequenza con routine IoCompletion impostate da altri driver e prima di CompletionFunction. Per altre informazioni, vedere Routine IoCompletion per i runtime di integrazione di power power per dispositivi.

Poiché l'IRP è stato completato da tutti i driver quando viene chiamato CompletionFunction , CompletionFunction non deve chiamare IoCallDriver, PoCallDriver o PoStartNextPowerIrp con l'IRP che ha avuto origine. Tuttavia, potrebbe chiamare queste routine per un'IRP di alimentazione diversa. Questa routine esegue invece tutte le azioni aggiuntive richieste dal driver che ha originato l'IRP. Se il driver ha inviato l'IRP del dispositivo in risposta a un IRP di sistema, CompletionFunction potrebbe completare l'IRP di sistema. Per altre informazioni, vedere Gestione di un Set-Power IRP di sistema in un proprietario di Power Policy del dispositivo.

In risposta alla chiamata a PoRequestPowerIrp, il risparmio energia alloca un IRP di alimentazione e lo invia all'inizio dello stack di dispositivi per il dispositivo. Il risparmio energia restituisce un puntatore all'IRP allocato.

Se non si verificano errori, PoRequestPowerIrp restituisce STATUS_PENDING. Questo stato indica che l'IRP è stato inviato correttamente ed è in attesa di completamento. La chiamata ha esito negativo se il risparmio energia non può allocare l'IRP o se il chiamante ha specificato un codice IRP di alimentazione secondaria non valido.

Le richieste di accensione di un dispositivo devono essere gestite prima dal driver del bus sottostante per il dispositivo e quindi da ogni driver successivamente superiore nello stack. Pertanto, quando si invia una richiesta PowerDeviceD0 , il driver deve assicurarsi che CompletionFunction esegua le attività necessarie dopo il completamento dell'IRP e che il dispositivo sia acceso.

Quando si spegne un dispositivo (PowerDeviceD3), ogni driver nello stack di dispositivi deve salvare tutto il contesto necessario ed eseguire le operazioni di pulizia necessarie prima di inviare l'IRP al driver inferiore successivo. L'estensione delle informazioni sul contesto e la pulizia dipendono dal tipo di driver. Un driver di funzione deve salvare il contesto hardware; un driver di filtro potrebbe dover salvare il proprio contesto software. Un oggetto CompletionFunction impostato in questa situazione può eseguire azioni associate a un IRP di alimentazione completata, ma il driver non può accedere al dispositivo.