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.