REQUEST_POWER_COMPLETE função de retorno de chamada (wdm.h)
A rotina de retorno de chamada 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 completa.
[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 de IRP_MN_XXX com suporte na seção Comentários.
[in] PowerState
Especifica o de estado de energia do dispositivo ou de estado de energia do sistema que foi passado para a rotina de 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.
Valor de retorno
Nenhum
Observações
Um driver que envia um IRP de energia pode precisar executar tarefas adicionais depois que todos os outros drivers tiverem concluído o IRP. Em caso afirmativo, o driver de envio deve registrar um rotina de retorno de chamada do PowerCompletion durante a chamada para a rotina de PoRequestPowerIrp que aloca o IRP.
A rotina de retorno de chamada PowerCompletion do driver é usada apenas para IRP_MJ_POWER IRPs que têm códigos IRP menores de IRP_MN_SET_POWER, IRP_MN_QUERY_POWERe IRP_MN_WAIT_WAKE. Para obter mais informações, consulte envio de IRP_MN_QUERY_POWER ou IRP_MN_SET_POWER para de estados de energia de dispositivo e rotinas de retorno de chamada de espera/ativação.
O gerente de E/S chama a rotina de powercompletion do driver de envio somente depois que o gerente de E/S chamar todas as rotinas de de IoCompletion que foram definidas por outros drivers à medida que passavam o IRP na pilha. A rotina PowerCompletion executa quaisquer tarefas adicionais que o remetente do IRP requer depois que todos os outros drivers tiverem concluído o IRP. A rotina de PowerCompletion não deve liberar o IRP– o power manager faz isso.
A rotina do PowerCompletion é chamada em IRQL = PASSIVE_LEVEL ou IRQL = DISPATCH_LEVEL.
Exemplos
Para definir uma rotina de retorno de chamada 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 encontram erros e é um requisito para gravar drivers para o sistema operacional Windows.
Por exemplo, para definir uma rotina de retorno de chamada PowerCompletion denominada 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 anotação _Use_decl_annotations_
à sua definição de função. A anotação _Use_decl_annotations_
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 |
---|---|
da Plataforma de Destino | Área de trabalho |
cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Chamado no IRQL <= DISPATCH_LEVEL (consulte a seção Comentários). |