Función FltCbdqInsertIo (fltkernel.h)

FltCbdqInsertIo inserta la estructura de datos de devolución de llamada para una operación de E/S en una cola de datos de devolución de llamada del controlador de filtro.

Sintaxis

NTSTATUS FLTAPI FltCbdqInsertIo(
  [in, out]      PFLT_CALLBACK_DATA_QUEUE            Cbdq,
  [in]           PFLT_CALLBACK_DATA                  Cbd,
  [in, optional] PFLT_CALLBACK_DATA_QUEUE_IO_CONTEXT Context,
  [in, optional] PVOID                               InsertContext
);

Parámetros

[in, out] Cbdq

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

[in] Cbd

Puntero a la estructura de datos de devolución de llamada (FLT_CALLBACK_DATA) para la operación de E/S que se va a poner en cola. La operación debe ser una operación de E/S basada en IRP.

[in, optional] Context

Variable proporcionada por el autor de la llamada que recibe un puntero de contexto opaco para la solicitud de E/S. Los controladores de filtro pueden usar este puntero para identificar un elemento específico de la cola para que se pueda quitar llamando a FltCbdqRemoveIo. Si el controlador de filtro no es necesario para quitar solicitudes de E/S concretas de la cola, este parámetro puede ser NULL.

[in, optional] InsertContext

Puntero de contexto que se va a pasar a la rutina de devolución de llamada CbdqInsertIo del controlador de filtro.

Valor devuelto

FltCbdqInsertIo devuelve STATUS_SUCCESS cuando la estructura de datos de devolución de llamada se insertó en la cola de datos de devolución de llamada o en un valor NTSTATUS adecuado, como el siguiente:

Código devuelto Descripción
STATUS_FLT_CBDQ_DISABLED La estructura de datos de devolución de llamada no se insertó en la cola de datos de devolución de llamada porque la cola está deshabilitada actualmente. Para volver a habilitar la cola, llame a FltCbdqEnable. Se trata de un código de error.

Nota

En el caso de éxito, FltCbdqInsertIo devuelve cualquier devolución de llamada insertIo del filtro; Por ejemplo, un filtro puede devolver STATUS_SUCCESS o STATUS_PENDING para indicar que se ha realizado correctamente. Es importante que el filtro sea autocongruente en el valor que use para indicar que se ha realizado correctamente.

Comentarios

FltCbdqInsertIo inserta la estructura de datos de devolución de llamada (FLT_CALLBACK_DATA) especificada en una cola de datos de devolución de llamada del controlador de filtro.

  • Tenga en cuenta que hay una posible condición de carrera entre un controlador de filtro que inserta los datos de devolución de llamada y el IRP asociado que se va a cancelar. Esto se puede evitar invocando inmediatamente la rutina de cancelación de la cola si el IRP ya se ha cancelado.

Los controladores de filtro pueden usar las rutinas FltCbdqXxx para implementar una cola de datos de devolución de llamada para operaciones de E/S basadas en IRP. Mediante el uso de estas rutinas, los controladores de filtro 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 filtro.

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 .

Una cola de datos de devolución de llamada se inicializa mediante una llamada a FltCbdqInitialize. FltCbdqInsertIo usa las funciones proporcionadas en la tabla de distribución de la cola para bloquear la cola e insertar la estructura de datos de devolución de llamada en la cola. La propia operación de inserción se realiza mediante la rutina CbdqInsertIo de la cola.

Consulte FltCbdqInitialize para obtener más información sobre cómo crear una cola de datos de devolución de llamada. Use FltCbdqRemoveIo para quitar una solicitud de E/S determinada de la cola o FltCbdqRemoveNextIo para quitar la siguiente solicitud de E/S disponible.

Si la cola está protegida por un bloqueo de número en lugar de una variable de recurso o objeto de exclusión mutua, el autor de la llamada de FltCbdqInsertIo se puede ejecutar en IRQL <= DISPATCH_LEVEL. Si se usa una exclusión mutua o un recurso, el autor de la llamada debe ejecutarse en IRQL <= APC_LEVEL.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado fltkernel.h (incluya Fltkernel.h)
IRQL vea la sección Comentarios.

Consulte también

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInitialize

FltCbdqRemoveIo

FltCbdqRemoveNextIo