Compartir a través de


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) de 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 en 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 del controlador de filtro CbdqInsertIo.

Valor devuelto

fltCbdqInsertIo devuelve STATUS_SUCCESS cuando se insertó la estructura de datos de devolución de llamada en la cola de datos de devolución de llamada o 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 caso de éxito, FltCbdqInsertIo devuelve lo que devuelve la devolución de llamada de 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 autocoherencia en el valor que use para indicar que se ha realizado correctamente.

Observaciones

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 cancela. 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 de FltCbdqXxx para implementar una cola de datos de devolución de llamada para las operaciones de E/S basadas en IRP. Con estas rutinas, los controladores de filtro pueden hacer que sus colas sean seguras; el sistema controla de forma transparente la cancelación de E/S para los controladores de filtro.

Las rutinas de 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.

Se inicializa una cola de datos de devolución de llamada llamando 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 un objeto de exclusión mutua o variable de recurso, el autor de la llamada de FltCbdqInsertIo puede ejecutarse 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 Valor
de la plataforma de destino de Universal
encabezado de fltkernel.h (incluya Fltkernel.h)
irQL Consulte la sección Comentarios.

Consulte también

FLT_CALLBACK_DATA

FLT_CALLBACK_DATA_QUEUE

FLT_IS_IRP_OPERATION

FltCbdqDisable

FltCbdqEnable

FltCbdqInitialize

FltCbdqRemoveIo

FltCbdqRemoveNextIo