REQUEST_POWER_COMPLETE funzione di callback (wdm.h)
La routine di callback di PowerCompletion completa l'elaborazione di un'IRP di alimentazione.
Sintassi
REQUEST_POWER_COMPLETE RequestPowerComplete;
void RequestPowerComplete(
[in] PDEVICE_OBJECT DeviceObject,
[in] UCHAR MinorFunction,
[in] POWER_STATE PowerState,
[in, optional] PVOID Context,
[in] PIO_STATUS_BLOCK IoStatus
)
{...}
Parametri
[in] DeviceObject
Puntatore al DEVICE_OBJECT di destinazione per l'IRP di alimentazione completata.
[in] MinorFunction
Specifica il codice della funzione secondaria nell'IRP di alimentazione. Per altre informazioni, vedere l'elenco dei codici IRP_MN_XXX supportati nella sezione Osservazioni.
[in] PowerState
Specifica lo stato di alimentazione del dispositivo o lo stato di alimentazione del sistema passato alla routine PoRequestPowerIrp .
[in, optional] Context
Puntatore al contesto passato a PoRequestPowerIrp.
[in] IoStatus
Puntatore alla struttura IO_STATUS_BLOCK per l'IRP completata.
Valore restituito
nessuno
Osservazioni
Un driver che invia un'IRP di alimentazione potrebbe dover eseguire attività aggiuntive dopo che tutti gli altri driver hanno completato l'IRP. In tal caso, il driver di invio deve registrare una routine di callback di PowerCompletion durante la chiamata alla routine PoRequestPowerIrp che alloca l'IRP.
La routine di callback di PowerCompletion di un driver viene usata solo per IRP_MJ_POWER IRP con codici IRP secondari di IRP_MN_SET_POWER, IRP_MN_QUERY_POWER e IRP_MN_WAIT_WAKE. Per altre informazioni, vedere Invio di IRP_MN_QUERY_POWER o IRP_MN_SET_POWER per Gli stati di alimentazione del dispositivo e le routine di callback di attesa/riattivazione.
Il gestore I/O chiama la routine PowerCompletion del driver di invio solo dopo che il gestore I/O ha chiamato tutte le routine IoCompletion impostate da altri driver mentre passavano l'IRP verso il basso dello stack. La routine PowerCompletion esegue tutte le attività aggiuntive necessarie al mittente dell'IRP dopo che tutti gli altri driver hanno completato l'IRP. La routine PowerCompletion non deve liberare l'IRP, ovvero il risparmio energia.
La routine PowerCompletion viene chiamata in IRQL = PASSIVE_LEVEL o IRQL = DISPATCH_LEVEL.
Esempio
Per definire una routine di callback di PowerCompletion , è prima necessario specificare una dichiarazione di funzione che identifica il tipo di routine di callback che si sta definendo. Windows fornisce un set di tipi di funzione di callback per i driver. La dichiarazione di una funzione usando i tipi di funzione callback consente l'analisi del codice per i driver, il verifica driver statico (SDV) e altri strumenti di verifica trovano errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.
Ad esempio, per definire una routine di callback di PowerCompletion denominata MyPowerCompletion
, usare il tipo di REQUEST_POWER_COMPLETE, come illustrato nell'esempio di codice seguente:
REQUEST_POWER_COMPLETE MyPowerCompletion;
Implementare quindi la routine di callback come indicato di seguito:
_Use_decl_annotations_
VOID
MyPowerCompletion(
PDEVICE_OBJECT DeviceObject,
UCHAR MinorFunction,
POWER_STATE PowerState,
PVOID Context,
PIO_STATUS_BLOCK IoStatus
)
{
// Function body
}
Il tipo di funzione REQUEST_POWER_COMPLETE è definito nel file di intestazione Wdm.h. Per identificare in modo più accurato gli errori quando si eseguono gli strumenti di analisi del codice, assicurarsi di aggiungere l'annotazione _Use_decl_annotations_
alla definizione della funzione. L'annotazione _Use_decl_annotations_
garantisce che vengano usate le annotazioni applicate al tipo di funzione REQUEST_POWER_COMPLETE nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo per i driver WDM. Per informazioni su _Use_decl_annotations_
, vedere Annotazione del comportamento della funzione.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Desktop |
Intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Chiamato in IRQL <= DISPATCH_LEVEL (vedere la sezione Osservazioni). |