Función FltCbdqInitialize (fltkernel.h)

FltCbdqInitialize inicializa una tabla de distribución de cola de datos de devolución de llamada del controlador minifiltro.

Sintaxis

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

Puntero de instancia opaco para la instancia cuya cola de datos de devolución de llamada se va a inicializar.

[in, out] Cbdq

Puntero a una cola de datos de devolución de llamada asignada por el controlador de minifiltro.

[in] CbdqInsertIo

Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada. El Administrador de filtros llama a esta rutina para insertar la estructura de datos de devolución de llamada especificada en la cola. Esta rutina se declara de la siguiente manera:

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

Cbdq

Puntero a la cola de datos de devolución de llamada segura para cancelación del controlador minifiltro. Esta cola debe haberse inicializado llamando a FltCbdqInitialize.

Cbd

Puntero a la estructura de datos de devolución de llamada que se va a insertar en la cola.

InsertContext

Puntero de información de contexto que se pasó como parámetro InsertContext a FltCbdqInsertIo.

[in] CbdqRemoveIo

Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada. El Administrador de filtros llama a esta rutina para quitar la estructura de datos de devolución de llamada especificada de la cola. Esta rutina se declara de la siguiente manera:

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

Cbdq

Puntero a la cola de datos de devolución de llamada segura para cancelación del controlador minifiltro. Esta cola debe haberse inicializado llamando a FltCbdqInitialize.

Cbd

Puntero a la estructura de datos de devolución de llamada que se va a quitar de la cola.

[in] CbdqPeekNextIo

Puntero a una rutina de devolución de llamada proporcionada por el autor de la llamada. El Administrador de filtros llama a esta función para obtener un puntero a la siguiente operación de E/S que coincida con PeekContext en la cola; o, si Cbd es NULL, para obtener un puntero a la primera operación de E/S coincidente en la cola. El controlador de minifiltro define completamente el significado de PeekContext y define cuándo una operación de E/S coincide con un PeekContext determinado. Esta rutina se declara de la siguiente manera:

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

Puntero a la cola de datos de devolución de llamada segura para cancelación del controlador minifiltro. Esta cola debe haberse inicializado llamando a FltCbdqInitialize.

Cbd

Puntero a la estructura de datos de devolución de llamada que marca la posición de la cola para empezar a buscar una coincidencia con PeekContext. Si Cbd es NULL, la búsqueda comienza en la cabeza de la cola.

PeekContext

Puntero de información de contexto que se pasó como parámetro PeekContext a FltCbdqRemoveNextIo.

[in] CbdqAcquire

Puntero a una rutina de devolución de llamada de bloqueo de cola proporcionada por el autor de la llamada. El Administrador de filtros llama a esta rutina para adquirir el bloqueo en la cola antes de intentar insertar o quitar un elemento de la cola. Esta rutina se declara de la siguiente manera:

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

Cbdq

Puntero a la cola de datos de devolución de llamada segura para cancelación del controlador minifiltro. Esta cola debe haberse inicializado llamando a FltCbdqInitialize.

Irql

Puntero a una variable proporcionada por el sistema que recibe el IRQL actual. La misma variable se pasa a la rutina CbdqRelease correspondiente.

[in] CbdqRelease

Puntero a una rutina de devolución de llamada de bloqueo de cola de liberación proporcionada por el autor de la llamada. El Administrador de filtros llama a esta rutina para liberar el bloqueo que obtuvo llamando a la rutina CbdqAcquire correspondiente. Esta rutina se declara de la siguiente manera:

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

Cbdq

Puntero a la cola de datos de devolución de llamada segura para cancelación del controlador minifiltro. Esta cola debe haberse inicializado llamando a FltCbdqInitialize.

Irql

La misma variable proporcionada por el sistema que recibió el IRQL actual que el parámetro Irql a la rutina CbdqAcquire correspondiente.

[in] CbdqCompleteCanceledIo

Puntero a una rutina de cancelación proporcionada por el autor de la llamada. El Administrador de filtros llama a esta rutina para indicar al controlador de minifiltro que complete una operación de E/S cancelada. Esta rutina se declara de la siguiente manera:

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

Cbdq

Puntero a la cola de datos de devolución de llamada segura para cancelación del controlador minifiltro. Esta cola debe haberse inicializado llamando a FltCbdqInitialize.

Cbd

Puntero a la estructura de datos de devolución de llamada para la operación de E/S cancelada.

Valor devuelto

FltCbdqInitialize devuelve STATUS_SUCCESS o un valor NTSTATUS adecuado.

Comentarios

La cola de datos de devolución de llamada recién inicializada está en estado habilitado, lo que significa que los elementos de estructura de datos de devolución de llamada se pueden insertar en la cola. La cola se puede deshabilitar llamando a FltCbdqDisable y reenabled llamando a FltCbdqEnable.

Los controladores de minifiltro pueden usar las rutinas FltCbdqXxx para implementar una cola de datos de devolución de llamada para las operaciones de E/S basadas en IRP. Mediante el uso de estas rutinas, los controladores de minifiltro pueden hacer que sus colas sean seguras para cancelar; el sistema controla de forma transparente la cancelación de E/S para los controladores de minifiltro.

Las rutinas FltCbdqXxx solo se pueden usar para las operaciones de E/S basadas en IRP. Para determinar si una estructura de datos de devolución de llamada determinada representa una operación de E/S basada en IRP, use la macro FLT_IS_IRP_OPERATION .

Los controladores de minifiltro pueden usar cualquier implementación interna para la cola. El Administrador de filtros interactúa con la implementación de la cola del controlador de minifiltro únicamente a través del conjunto de rutinas de envío proporcionadas por FltCbdqInitialize.

El sistema bloquea y desbloquea automáticamente la cola según sea necesario. Los controladores de minifiltro no implementan ningún bloqueo dentro de sus rutinas CbdqInsertIo, CbdqRemoveIo y CbdqPeekNextIo .

Los controladores de minifiltro pueden usar cualquiera de los primitivos de sincronización del sistema operativo como mecanismo de bloqueo en sus rutinas CbdqAcquire y CbdqRelease , como un bloqueo de número, un objeto de exclusión mutua o una variable de recurso. Tenga en cuenta que si un controlador de minifiltro usa un bloqueo de número en lugar de una exclusión mutua o un recurso para proteger la cola, puede llamar a las rutinas FltCbdqXxx en IRQL <= DISPATCH_LEVEL. Si se usa una exclusión mutua o un recurso, el controlador de minifiltro debe ejecutarse en IRQL <= APC_LEVEL cuando llama a cualquiera de estas rutinas excepto FltCbdqInitialize.

El controlador de minifiltro no manipula la cola directamente. En su lugar, llama a FltCbdqInsertIo, FltCbdqRemoveIo y FltCbdqRemoveNextIo para agregar o quitar una estructura de datos de devolución de llamada. Estas rutinas, a su vez, llaman a las funciones de devolución de llamada que el controlador de minifiltro proporcionó a FltCbdqInitialize.

Los controladores de minifiltro deben implementar las rutinas de cola de la siguiente manera.

Rutina cbdq Implementación
CbdqInsertIo Inserte la estructura de datos de devolución de llamada especificada en la cola.
CbdqRemoveIo Quite la estructura de datos de devolución de llamada especificada de la cola.
CbdqPeekNextIo Esta rutina debe permitir que el sistema recorra en bucle las estructuras de datos de devolución de llamada con peekContext coincidente en la cola. Cbd = CbdqPeekNextIo(Cbdq, NULL, PeekContext) debe devolver la primera entrada coincidente en la cola y CbdqPeekNextIo(Cbdq, Cbd,PeekContext) debe devolver la siguiente entrada coincidente después de la estructura de datos de devolución de llamada especificada en la cola. El controlador de minifiltro define completamente el significado de PeekContext y define cuándo una estructura de datos de devolución de llamada coincide con un valor PeekContext .
CbdqAcquire Esta rutina debe bloquear la cola para que ningún otro subproceso pueda acceder a ella. Los controladores de minifiltro pueden usar cualquier mecanismo de bloqueo para bloquear la cola. Si el controlador de minifiltro usa la rutina KeAcquireSpinLock , el controlador de minifiltro puede usar la ubicación de memoria a la que apunta el parámetro Irql de la rutina para almacenar el IRQL. De lo contrario, los controladores de minifiltro pueden omitir ese parámetro.
CbdqRelease Esta rutina debe desbloquear la cola creada por CbdqAcquire. Si el controlador de minifiltro usó un bloqueo de giro y devolvió el valor IRQL en el parámetro Irql de CbdqAcquire, el sistema pasa ese valor en el parámetro Irql de CbdqRelease. El controlador de minifiltro puede usar IRQL para desbloquear el bloqueo de número llamando a KeReleaseSpinLock. De lo contrario, los controladores de minifiltro pueden omitir el parámetro Irql .
CbdqCompleteCanceledIo Esta rutina debe completar una operación de E/S cancelada. Normalmente, los controladores de minifiltro simplemente pueden llamar a FltCompletePendedPreOperation(Data, FLT_PREOP_COMPLETE, NULL). Los controladores de minifiltro no necesitan quitar la cola de la estructura de datos de devolución de llamada: el Administrador de filtros llama automáticamente a la cola CbdqRemoveIo antes de llamar a CbdqCompleteCanceledIo.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado fltkernel.h (incluya Fltkernel.h)
IRQL Cualquier nivel

Consulte también

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInsertIo

FltCbdqRemoveIo

FltCbdqRemoveNextIo

FltCompletePendedPreOperation

KeAcquireSpinLock

KeReleaseSpinLock