Compartilhar via


Definindo um objeto de retorno de chamada

Um driver pode criar um objeto de retorno de chamada, por meio do qual outros drivers podem solicitar notificação de condições definidas pelo driver de criação. A figura a seguir mostra as etapas envolvidas na definição de um objeto de retorno de chamada.

diagrama ilustrando a definição de um objeto de retorno de chamada.

Antes de criar o objeto, o driver chama InitializeObjectAttributes para definir seus atributos. Um objeto de retorno de chamada deve ter um nome, que não pode corresponder ao nome de um retorno de chamada definido pelo sistema; ele pode ter quaisquer outros atributos que seu criador considera apropriados, normalmente OBJ_CASE_INSENSITIVE. Em seguida, o driver chama ExCreateCallback, passando um ponteiro para os atributos inicializados e um local no qual receber um identificador para o objeto de retorno de chamada. Ele também passa dois boolianos, indicando se o sistema deve criar o objeto de retorno de chamada se esse objeto nomeado ainda não existir e se o objeto deve permitir mais de uma rotina de retorno de chamada registrada.

O driver define as condições para as quais chamará as rotinas de retorno de chamada registradas. As condições assumem a forma de dois argumentos, cada um apontando para um parâmetro definido pelo driver que cria o retorno de chamada. Você deve documentar essas condições, juntamente com o nome do objeto de retorno de chamada e o IRQL no qual ele solicita notificação, para clientes do driver.

Quando a condição de retorno de chamada ocorre, o driver chama ExNotifyCallback, passando seu identificador para o objeto de retorno de chamada e os dois argumentos. Em seguida, o sistema chama todas as rotinas de retorno de chamada registradas para o objeto de retorno de chamada, na ordem em que foram registradas, passando os dois argumentos e um ponteiro para o contexto fornecido quando a rotina foi registrada. O driver deve chamar ExNotifyCallback em IRQL <= DISPATCH_LEVEL; o sistema chama as rotinas de retorno de chamada no mesmo IRQL em que o driver fez essa chamada.

Depois que todas as operações tiverem sido concluídas com o objeto de retorno de chamada, o driver que criou o retorno de chamada deverá chamar ObDereferenceObject para diminuir sua contagem de referência e garantir que o objeto seja excluído.