Partilhar via


Usando um objeto de retorno de chamada definido pelo sistema

O sistema define três objetos de retorno de chamada para uso do driver:

\Retorno de chamada\DefinirHoraSistema

\Callback\EstadoDeEnergia

\Callback\ProcessorAdd

Os controladores que usam a hora do sistema (por exemplo, controladores do sistema de arquivos) podem se registrar no objeto de retorno de chamada \Callback\SetSystemTime. Esta callback permite a notificação quando a hora do sistema muda.

O objeto de retorno de chamada \Callback\PowerState fornece notificação quando ocorre uma das seguintes situações:

  • O sistema muda de alimentação AC para DC ou vice-versa.

  • A política de energia do sistema muda como resultado de uma solicitação de usuário ou aplicativo.

  • A transição para um estado de suspensão ou desligamento do sistema é iminente. Um driver pode solicitar notificação para que ele possa bloquear o código na memória em antecipação ao desligamento. As rotinas de retorno de chamada serão notificadas antes que o gestor de energia envie o IRP para definir potência do sistema.

A chamada de retorno \Callback\ProcessorAdd notifica quando um novo processador é adicionado ao sistema.

Para usar um retorno de chamada definido pelo sistema, um driver inicializa um bloco de atributos chamando InitializeObjectAttributes com o nome do retorno de chamada e, em seguida, abre o objeto de retorno de chamada (ExCreateCallback), assim como para um retorno de chamada definido pelo driver. O driver não deve solicitar que o objeto de retorno de chamada seja criado.

Com o identificador retornado por ExCreateCallback, o driver chama ExRegisterCallback para registar uma rotina de notificação, passando um ponteiro para um contexto arbitrário e outro para a sua rotina. Um motorista pode registrar sua rotina de retorno de chamada a qualquer momento. Quando a condição especificada ocorre, o sistema chama a rotina de callback registada em IRQL<=DISPATCH_LEVEL.

Quando o driver não precisa mais de notificação, ele deve chamar ExUnregisterCallback para excluir sua rotina de retorno de chamada da lista de retornos de chamada registrados e remover sua referência ao objeto de retorno de chamada.