Usando um objeto de retorno de chamada Driver-Defined

Para usar um objeto de retorno de chamada definido por outro driver, um driver abre o objeto e registra uma rotina a ser chamada quando o retorno de chamada é disparado, 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.

diagrama ilustrando o registro da notificação de retorno de chamada.

Antes de abrir o objeto, o driver deve chamar InitializeObjectAttributes para criar um bloco de atributo, especificando o nome do objeto. Depois de ter um ponteiro para um bloco de atributo, ele chama ExCreateCallback, passando o ponteiro de 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.

Em seguida, o driver pode 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 sempre que ele é chamado. Normalmente, esse parâmetro é um ponteiro para um bloco de dados de contexto, que o chamador deve alocar do pool nãopagado se a rotina puder ser chamada em DISPATCH_LEVEL. Os dois argumentos são definidos pelo componente que criou o retorno de chamada. Normalmente, os argumentos fornecem informações sobre as condições que dispararam o retorno de chamada.

Quando o criador do retorno de chamada dispara a notificação, o sistema chama a rotina registrada, 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 driver pode executar todas as tarefas necessárias para as condições atuais.

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