Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Para usar um objeto de retorno de chamada definido por outro driver, um driver abre o objeto e, em seguida, registra uma rotina a ser chamada quando o retorno de chamada é acionado, conforme mostrado na figura a seguir. O driver que solicita a notificação deve saber o nome do objeto de retorno de chamada e deve entender a semântica dos argumentos passados para a rotina de retorno de chamada.
Antes de abrir o objeto, o driver deve chamar InitializeObjectAttributes para criar um bloco de atributos, especificando o nome do objeto. Depois de ter um ponteiro para um bloco de atributos, ele chama ExCreateCallback, passando o ponteiro do atributo, um local no qual receber um identificador para o retorno de chamada e FALSE para o parâmetro Create , indicando que ele requer um objeto de retorno de chamada existente.
O driver pode então chamar ExRegisterCallback com o identificador retornado para registrar sua rotina de retorno de chamada.
A rotina de retorno de chamada tem o seguinte protótipo:
typedef VOID (*PCALLBACK_FUNCTION ) (
IN PVOID CallbackContext,
IN PVOID Argument1,
IN PVOID Argument2
);
O parâmetro CallbackContext é o ponteiro de contexto a ser passado para a rotina de retorno de chamada cada vez que esta é chamada. Normalmente, esse parâmetro é um ponteiro para um bloco de dados de contexto, que o chamador deve alocar do pool não paginado se a rotina puder ser chamada em DISPATCH_LEVEL. Os dois argumentos são definidos pelo componente que criou o callback. Normalmente, os argumentos fornecem informações sobre as condições que acionaram o callback.
Quando o criador do callback aciona a notificação, o sistema chama a rotina registada, passando um ponteiro para o contexto e os dois argumentos. Os valores para os argumentos são fornecidos pelo componente que criou o retorno de chamada. A rotina de retorno de chamada é chamada no mesmo IRQL no qual o driver de criação disparou a notificação, que é sempre IRQL <= DISPATCH_LEVEL.
Em sua rotina de retorno de chamada, um motorista pode executar quaisquer tarefas necessárias para as condições atuais.
Quando o driver não precisa mais de notificação, ele deve chamar ExUnregisterCallback para remover sua rotina da lista de retornos de chamada registrados e remover sua referência ao objeto de retorno de chamada.