REQUEST_POWER_COMPLETE função de retorno de chamada (wdm.h)
A rotina de retorno de chamada do PowerCompletion conclui o processamento de um IRP de energia.
Sintaxe
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
)
{...}
Parâmetros
[in] DeviceObject
Um ponteiro para o DEVICE_OBJECT de destino para o IRP de energia concluído.
[in] MinorFunction
Especifica o código de função secundária no IRP de energia. Para obter mais informações, consulte a lista de códigos IRP_MN_XXX com suporte na seção Comentários.
[in] PowerState
Especifica o estado de energia do dispositivo ou o estado de energia do sistema que foi passado para a rotina PoRequestPowerIrp .
[in, optional] Context
Um ponteiro para o contexto que foi passado para PoRequestPowerIrp.
[in] IoStatus
Um ponteiro para a estrutura de IO_STATUS_BLOCK para o IRP concluído.
Retornar valor
Nenhum
Comentários
Um driver que envia um IRP de energia pode precisar executar tarefas adicionais depois que todos os outros drivers tiverem concluído o IRP. Nesse caso, o driver de envio deve registrar uma rotina de retorno de chamada do PowerCompletion durante a chamada para a rotina PoRequestPowerIrp que aloca o IRP.
A rotina de retorno de chamada do PowerCompletion de um driver é usada apenas para IRP_MJ_POWER IRPs que têm códigos IRP menores de IRP_MN_SET_POWER, IRP_MN_QUERY_POWER e IRP_MN_WAIT_WAKE. Para obter mais informações, consulte Enviando IRP_MN_QUERY_POWER ou IRP_MN_SET_POWER para estados de energia do dispositivo e Rotinas de retorno de chamada de espera/ativação.
O gerente de E/S chama a rotina do PowerCompletion do driver de envio somente depois que o gerente de E/S tiver chamado todas as rotinas de IoCompletion que foram definidas por outros drivers à medida que passavam o IRP para baixo na pilha. A rotina PowerCompletion executa todas as tarefas adicionais que o remetente do IRP requer depois que todos os outros drivers tiverem concluído o IRP. A rotina do PowerCompletion não deve liberar o IRP– o power manager faz isso.
A rotina PowerCompletion é chamada em IRQL = PASSIVE_LEVEL ou IRQL = DISPATCH_LEVEL.
Exemplos
Para definir uma rotina de retorno de chamada do PowerCompletion , primeiro você deve fornecer uma declaração de função que identifique o tipo de rotina de retorno de chamada que você está definindo. O Windows fornece um conjunto de tipos de função de retorno de chamada para drivers. Declarar uma função usando os tipos de função de retorno de chamada ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para escrever drivers para o sistema operacional Windows.
Por exemplo, para definir uma rotina de retorno de chamada do PowerCompletion chamada MyPowerCompletion
, use o tipo REQUEST_POWER_COMPLETE conforme mostrado neste exemplo de código:
REQUEST_POWER_COMPLETE MyPowerCompletion;
Em seguida, implemente sua rotina de retorno de chamada da seguinte maneira:
_Use_decl_annotations_
VOID
MyPowerCompletion(
PDEVICE_OBJECT DeviceObject,
UCHAR MinorFunction,
POWER_STATE PowerState,
PVOID Context,
PIO_STATUS_BLOCK IoStatus
)
{
// Function body
}
O tipo de função REQUEST_POWER_COMPLETE é definido no arquivo de cabeçalho Wdm.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a _Use_decl_annotations_
anotação à sua definição de função. A _Use_decl_annotations_
anotação garante que as anotações aplicadas ao tipo de função REQUEST_POWER_COMPLETE no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers WDM. Para obter informações sobre _Use_decl_annotations_
, consulte Anotando o comportamento da função.
Requisitos
Requisito | Valor |
---|---|
Plataforma de Destino | Área de Trabalho |
Cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Chamado em IRQL <= DISPATCH_LEVEL (consulte a seção Comentários). |