Compartilhar via


Função FltCbdqInitialize (fltkernel.h)

FltCbdqInitialize inicializa a tabela de expedição de fila de dados de retorno de chamada de um driver de minifiltro.

Sintaxe

NTSTATUS FLTAPI FltCbdqInitialize(
  [in]      PFLT_INSTANCE                                 Instance,
  [in, out] PFLT_CALLBACK_DATA_QUEUE                      Cbdq,
  [in]      PFLT_CALLBACK_DATA_QUEUE_INSERT_IO            CbdqInsertIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO            CbdqRemoveIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO         CbdqPeekNextIo,
  [in]      PFLT_CALLBACK_DATA_QUEUE_ACQUIRE              CbdqAcquire,
  [in]      PFLT_CALLBACK_DATA_QUEUE_RELEASE              CbdqRelease,
  [in]      PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO CbdqCompleteCanceledIo
);

Parâmetros

[in] Instance

Ponteiro de instância opaca para a instância cuja fila de dados de retorno de chamada deve ser inicializada.

[in, out] Cbdq

Ponteiro para uma fila de dados de retorno de chamada alocada pelo driver de minifiltro.

[in] CbdqInsertIo

Ponteiro para uma rotina de retorno de chamada de inserção fornecida pelo chamador. O Gerenciador de Filtros chama essa rotina para inserir a estrutura de dados de retorno de chamada especificada na fila. Essa rotina é declarada da seguinte maneira:

typedef NTSTATUS
(*PFLT_CALLBACK_DATA_QUEUE_INSERT_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID InsertContext
      );

Cbdq

Ponteiro para a fila de dados de retorno de chamada cancel-safe do driver de minifiltro. Essa fila deve ter sido inicializada chamando FltCbdqInitialize.

Cbd

Ponteiro para a estrutura de dados de retorno de chamada a ser inserida na fila.

InsertContext

Ponteiro de informações de contexto que foi passado como o parâmetro InsertContext para FltCbdqInsertIo.

[in] CbdqRemoveIo

Ponteiro para uma rotina de retorno de chamada de remoção fornecida pelo chamador. O Gerenciador de Filtros chama essa rotina para remover a estrutura de dados de retorno de chamada especificada da fila. Essa rotina é declarada da seguinte maneira:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_REMOVE_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_ PFLT_CALLBACK_DATA Cbd
      );

Cbdq

Ponteiro para a fila de dados de retorno de chamada cancel-safe do driver de minifiltro. Essa fila deve ter sido inicializada chamando FltCbdqInitialize.

Cbd

Ponteiro para a estrutura de dados de retorno de chamada a ser removida da fila.

[in] CbdqPeekNextIo

Ponteiro para uma rotina de retorno de chamada de espiada fornecida pelo chamador. O Gerenciador de Filtros chama essa função para obter um ponteiro para a próxima operação de E/S correspondente a PeekContext na fila; ou, se o Cbd for NULL, para obter um ponteiro para a primeira operação de E/S correspondente na fila. O driver de minifiltro define totalmente o significado de PeekContext e define quando uma operação de E/S corresponde a um determinado PeekContext. Essa rotina é declarada da seguinte maneira:

typedef PFLT_CALLBACK_DATA
(*PFLT_CALLBACK_DATA_QUEUE_PEEK_NEXT_IO)(
      _In_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ PFLT_CALLBACK_DATA Cbd,
      _In_opt_ PVOID PeekContext
      );

Cbdq

Ponteiro para a fila de dados de retorno de chamada cancel-safe do driver de minifiltro. Essa fila deve ter sido inicializada chamando FltCbdqInitialize.

Cbd

Ponteiro para a estrutura de dados de retorno de chamada marcando a posição na fila para começar a pesquisar uma correspondência para PeekContext. Se o CBD for NULL, a pesquisa começará no início da fila.

PeekContext

Ponteiro de informações de contexto que foi passado como o parâmetro PeekContext para FltCbdqRemoveNextIo.

[in] CbdqAcquire

Ponteiro para uma rotina de retorno de chamada de bloqueio de fila fornecida pelo chamador. O Gerenciador de Filtros chama essa rotina para adquirir o bloqueio na fila antes de tentar inserir ou remover um item da fila. Essa rotina é declarada da seguinte maneira:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_ACQUIRE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Out_opt_ PKIRQL Irql
      );

Cbdq

Ponteiro para a fila de dados de retorno de chamada cancel-safe do driver de minifiltro. Essa fila deve ter sido inicializada chamando FltCbdqInitialize.

Irql

Ponteiro para uma variável fornecida pelo sistema que recebe o IRQL atual. A mesma variável é passada para a rotina de CbdqRelease correspondente.

[in] CbdqRelease

Ponteiro para uma rotina de retorno de chamada de bloqueio de fila de liberação fornecida pelo chamador. O Gerenciador de Filtros chama essa rotina para liberar o bloqueio obtido chamando a rotina cbdqAcquire correspondente. Essa rotina é declarada da seguinte maneira:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_RELEASE)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _In_opt_ KIRQL Irql
      );

Cbdq

Ponteiro para a fila de dados de retorno de chamada cancel-safe do driver de minifiltro. Essa fila deve ter sido inicializada chamando FltCbdqInitialize.

Irql

A mesma variável fornecida pelo sistema que recebeu o IRQL atual que o parâmetro Irql para a rotina de CbdqAcquire correspondente.

[in] CbdqCompleteCanceledIo

Ponteiro para uma rotina de cancelamento fornecida pelo chamador. O Gerenciador de Filtros chama essa rotina para sinalizar para o driver de minifiltro para concluir uma operação de E/S cancelada. Essa rotina é declarada da seguinte maneira:

typedef VOID
(*PFLT_CALLBACK_DATA_QUEUE_COMPLETE_CANCELED_IO)(
      _Inout_ PFLT_CALLBACK_DATA_QUEUE Cbdq,
      _Inout_ PFLT_CALLBACK_DATA Cbd
      );

Cbdq

Ponteiro para a fila de dados de retorno de chamada cancel-safe do driver de minifiltro. Essa fila deve ter sido inicializada chamando FltCbdqInitialize.

Cbd

Ponteiro para a estrutura de dados de retorno de chamada para a operação de E/S cancelada.

Retornar valor

FltCbdqInitialize retorna STATUS_SUCCESS ou um valor NTSTATUS apropriado.

Comentários

A fila de dados de retorno de chamada recém-inicializada está no estado habilitado, o que significa que os itens da estrutura de dados de retorno de chamada podem ser inseridos na fila. A fila pode ser desabilitada chamando FltCbdqDisable e reenabled chamando FltCbdqEnable.

Os drivers de minifiltro podem usar as rotinas fltCbdqXxx para implementar uma fila de dados de retorno de chamada para operações de E/S baseadas em IRP. Usando essas rotinas, os drivers de minifiltro podem tornar suas filas canceladas seguras; o sistema manipula de forma transparente o cancelamento de E/S para os drivers de minifiltro.

As rotinas fltCbdqXxx só podem ser usadas para operações de E/S baseadas em IRP. Para determinar se uma determinada estrutura de dados de retorno de chamada representa uma operação de E/S baseada em IRP, use a macro FLT_IS_IRP_OPERATION .

Os drivers de minifiltro podem usar qualquer implementação interna para a fila. O Gerenciador de Filtros interage com a implementação da fila do driver de minifiltro somente por meio do conjunto de rotinas de expedição fornecidas por FltCbdqInitialize.

O sistema bloqueia e desbloqueia automaticamente a fila conforme necessário. Os drivers de minifiltro não implementam nenhum bloqueio dentro de suas rotinas CbdqInsertIo, CbdqRemoveIo e CbdqPeekNextIo .

Os drivers de minifiltro podem usar qualquer um dos primitivos de sincronização do sistema operacional como o mecanismo de bloqueio em suas rotinas CbdqAcquire e CbdqRelease , como um bloqueio de rotação, um objeto mutex ou uma variável de recurso. Observe que, se um driver de minifiltro usa um bloqueio de rotação em vez de um mutex ou recurso para proteger a fila, ele pode chamar as rotinas fltCbdqXxx em IRQL <= DISPATCH_LEVEL. Se um mutex ou recurso for usado, o driver de minifiltro deverá estar em execução em IRQL <= APC_LEVEL quando chamar qualquer uma dessas rotinas, exceto FltCbdqInitialize.

O driver de minifiltro não manipula a fila diretamente. Em vez disso, ele chama FltCbdqInsertIo, FltCbdqRemoveIo e FltCbdqRemoveNextIo para adicionar ou remover uma estrutura de dados de retorno de chamada. Essas rotinas, por sua vez, chamam as funções de retorno de chamada que o driver de minifiltro forneceu ao FltCbdqInitialize.

Os drivers de minifiltro devem implementar as rotinas de fila da seguinte maneira.

Rotina cbdq Implementação
CbdqInsertIo Insira a estrutura de dados de retorno de chamada especificada na fila.
CbdqRemoveIo Remova a estrutura de dados de retorno de chamada especificada da fila.
CbdqPeekNextIo Essa rotina deve permitir que o sistema faça loop pelas estruturas de dados de retorno de chamada com PeekContext correspondente na fila. Cbd = CbdqPeekNextIo(Cbdq, NULL, PeekContext) deve retornar a primeira entrada correspondente na fila e CbdqPeekNextIo(Cbdq, Cbd, PeekContext) deve retornar a próxima entrada correspondente após a estrutura de dados de retorno de chamada fornecida na fila. O driver de minifiltro define totalmente o significado de PeekContext e define quando uma estrutura de dados de retorno de chamada corresponde a um valor PeekContext .
CbdqAcquire Essa rotina deve bloquear a fila para que nenhum outro thread possa acessá-la. Os drivers de minifiltro podem usar qualquer mecanismo de bloqueio para bloquear a fila. Se o driver de minifiltro usar a rotina KeAcquireSpinLock , o driver de minifiltro poderá usar o local de memória apontado pelo parâmetro Irql da rotina para armazenar o IRQL. Caso contrário, os drivers de minifiltro podem ignorar esse parâmetro.
CbdqRelease Essa rotina deve desbloquear a fila criada por CbdqAcquire. Se o driver de minifiltro usou um bloqueio de rotação e retornou o valor IRQL no parâmetro Irql de CbdqAcquire, o sistema passará esse valor no parâmetro Irql de CbdqRelease. O driver de minifiltro pode usar o IRQL para desbloquear o bloqueio de rotação chamando KeReleaseSpinLock. Caso contrário, os drivers de minifiltro podem ignorar o parâmetro Irql .
CbdqCompleteCanceledIo Essa rotina deve concluir uma operação de E/S cancelada. Normalmente, os drivers de minifiltro podem chamar FltCompletePendedPreOperation(Data, FLT_PREOP_COMPLETE, NULL). Os drivers de minifiltro não precisam desativar a estrutura de dados de retorno de chamada – o Gerenciador de Filtros chama automaticamente o CbdqRemoveIo da fila antes de chamar CbdqCompleteCanceledIo.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho fltkernel.h (inclua Fltkernel.h)
IRQL Qualquer nível

Confira também

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInsertIo

FltCbdqRemoveIo

FltCbdqRemoveNextIo

FltCompletePendedPreOperation

KeAcquireSpinLock

KeReleaseSpinLock