Usando um objeto de retorno de chamada System-Defined

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

\Callback\SetSystemTime

\Callback\PowerState

\Callback\ProcessorAdd

Os drivers que usam a hora do sistema (por exemplo, drivers do sistema de arquivos) podem se registrar para o objeto de retorno de chamada \Callback\SetSystemTime . Esse retorno de chamada fornece notificação quando a hora do sistema é alterada.

O objeto de retorno de chamada \Callback\PowerState fornece uma notificação quando ocorre um destes procedimentos:

  • O sistema alterna de ac para dc power ou vice-versa.

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

  • Uma 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 power manager envie o IRP de set-power do sistema.

O retorno de chamada \Callback\ProcessorAdd fornece notificação quando um novo processador é adicionado ao sistema.

Para usar um retorno de chamada definido pelo sistema, um driver inicializa um bloco de atributo 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 registrar uma rotina de notificação, passando um ponteiro para um contexto arbitrário e um ponteiro para sua rotina. Um driver pode registrar sua rotina de retorno de chamada a qualquer momento. Quando a condição especificada ocorre, o sistema chama a rotina de retorno de chamada registrada em IRQL<=DISPATCH_LEVEL.

Quando o driver não precisar mais de notificação, ele deverá 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.