Compartir a través de


PFLT_POST_OPERATION_CALLBACK función de devolución de llamada (fltkernel.h)

Un controlador de minifiltro puede registrar una o varias rutinas de tipo PFLT_POST_OPERATION_CALLBACK para realizar el procesamiento de finalización de las operaciones de E/S.

Sintaxis

PFLT_POST_OPERATION_CALLBACK PfltPostOperationCallback;

FLT_POSTOP_CALLBACK_STATUS PfltPostOperationCallback(
  [in, out]      PFLT_CALLBACK_DATA Data,
  [in]           PCFLT_RELATED_OBJECTS FltObjects,
  [in, optional] PVOID CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS Flags
)
{...}

Parámetros

[in, out] Data

Puntero a los datos de devolución de llamada FLT_CALLBACK_DATA estructura de la operación de E/S.

[in] FltObjects

Puntero a un administrador de filtros mantenido FLT_RELATED_OBJECTS estructura que contiene punteros opacos para los objetos relacionados con la solicitud de E/S actual.

[in, optional] CompletionContext

Puntero de contexto devuelto por la devolución de llamada del controlador de minifiltro PFLT_PRE_OPERATION_CALLBACK rutina. El puntero CompletionContext proporciona una manera de comunicar información de la rutina de devolución de llamada de operación previa a la rutina de devolución de llamada posterior a la operación.

[in] Flags

Máscara de bits de marcas que especifica cómo se va a realizar la devolución de llamada posterior a la operación.

Marca Significado
FLTFL_POST_OPERATION_DRAINING El administrador de filtros establece esta marca para indicar que la instancia del controlador de minifiltro se está desasociando y que se llama a esta rutina de devolución de llamada posterior a la operación para limpiar el contexto de finalización del controlador de minifiltro. La devolución de llamada posterior a la operación debe devolver FLT_POSTOP_FINISHED_PROCESSING. Si se establece esta marca, el parámetro Data apunta a una copia de la estructura de datos de devolución de llamada original para la operación, no a la estructura de datos de devolución de llamada original. Además, cuando se establece esta marca, se llama a la rutina de devolución de llamada posterior a la operación en IRQL <= APC_LEVEL.

Valor devuelto

Esta rutina de devolución de llamada devuelve uno de los siguientes valores de estado:

Código devuelto Descripción
FLT_POSTOP_FINISHED_PROCESSING
El controlador de minifiltro ha terminado el procesamiento de finalización de la operación de E/S y está devolviendo el control de la operación al administrador de filtros.

Una vez que la devolución de llamada posterior a la operación devuelve este valor de estado, el administrador de filtros continúa el procesamiento de finalización de la operación de E/S.

FLT_POSTOP_MORE_PROCESSING_REQUIRED
El controlador de minifiltro ha detenido el procesamiento de finalización para la operación de E/S, pero no devuelve el control de la operación al administrador de filtros.

La devolución de llamada posterior a la operación de un controlador minifiltro solo puede devolver este valor de estado si la devolución de llamada posterior al controlador de minifiltro ha publicado la operación de E/S en una cola de trabajo. El controlador de minifiltro debe reanudar finalmente el procesamiento de finalización de la operación de E/S.

Después de que la devolución de llamada posterior a la operación devuelva FLT_POSTOP_MORE_PROCESSING_REQUIRED, el administrador de filtros no realiza más procesamiento de la operación de E/S, a menos que se cumplan las dos condiciones siguientes:

  • La devolución de llamada posterior a la operación ha publicado la operación de E/S en una cola de trabajo.
  • Una vez que la rutina de trabajo realiza el procesamiento de finalización de la operación, llama a FltCompletePendedPostOperation para devolver el control de la operación al administrador de filtros.
Este valor de estado solo se puede devolver 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 .
FLT_POSTOP_DISALLOW_FSFILTER_IO
El controlador de minifiltro no permite una operación QueryOpen rápida y fuerza la operación hacia abajo en la ruta de acceso lenta. Si lo hace, el administrador de E/S atenderá la solicitud realizando una apertura, consulta o cierre del archivo. Los controladores de minifiltro solo deben devolver este estado para QueryOpen.

Comentarios

Una rutina de devolución de llamada posterior a la operación del controlador minifiltro realiza el procesamiento de finalización para uno o varios tipos de operaciones de E/S.

Las rutinas de devolución de llamada posteriores a la operación son similares a las rutinas de finalización que usan los controladores de filtro del sistema de archivos heredados.

Las rutinas de devolución de llamada posteriores a la operación se llaman en un contexto de subproceso arbitrario, en IRQL <= DISPATCH_LEVEL. Dado que se puede llamar a esta rutina de devolución de llamada en IRQL DISPATCH_LEVEL, está sujeta a las siguientes restricciones:

  • No puede llamar de forma segura a ninguna rutina de modo kernel que se debe ejecutar en un IRQL inferior.
  • Todas las estructuras de datos usadas en esta rutina deben asignarse desde un grupo no paginado.
  • No se puede hacer paginable.
  • No puede adquirir recursos, exclusiones mutuas ni exclusiones mutuas rápidas. Sin embargo, puede adquirir bloqueos de giro.
  • No puede obtener, establecer ni eliminar contextos, pero puede liberar contextos.

Cualquier procesamiento de finalización de E/S que deba realizarse en IRQL < DISPATCH_LEVEL no se puede realizar directamente en la rutina de devolución de llamada de postoperación. En su lugar, debe publicarse en una cola de trabajo llamando a una rutina como FltDoCompletionProcessingWhenSafe o FltQueueDeferredIoWorkItem.

Tenga en cuenta que FltDoCompletionProcessingWhenSafe nunca debe llamarse si el parámetro Flags de la devolución de llamada posterior a la operación tiene establecido el bit FLTFL_POST_OPERATION_DRAINING. A continuación se muestran excepciones a esta regla:

  • Si la rutina de devolución de llamada previa de un controlador minifiltro devuelve FLT_PREOP_SYNCHRONIZE para una operación de E/S basada en IRP, se garantiza que se llama a la rutina de devolución de llamada posterior a la operación en IRQL <= APC_LEVEL, en el mismo contexto de subproceso que la devolución de llamada previa a la operación.
  • Se garantiza que las rutinas de devolución de llamada posteriores a la creación se llamen en irQL PASSIVE_LEVEL, en el contexto del subproceso que originó la operación de IRP_MJ_CREATE.

Un controlador de minifiltro registra una rutina de devolución de llamada posterior a la operación para un tipo determinado de operación de E/S almacenando el punto de entrada de la rutina de devolución de llamada en la matriz OperationRegistration de la estructura FLT_REGISTRATION . El controlador de minifiltro pasa esta estructura como parámetro a FltRegisterFilter en su rutina DriverEntry .

Un controlador de minifiltro puede registrar una rutina de devolución de llamada posterior a la operación para un tipo determinado de operación de E/S sin registrar una rutina de devolución de llamada previa a la operación (PFLT_PRE_OPERATION_CALLBACK) y viceversa.

Requisitos

Requisito Value
Cliente mínimo compatible Disponible en el paquete acumulativo de actualizaciones 1 de Microsoft Windows 2000 para SP4, Windows XP SP2, Windows Server 2003 SP1 y sistemas operativos Windows posteriores.
Plataforma de destino Escritorio
Encabezado fltkernel.h (incluya FltKernel.h)
IRQL Consulte la sección Comentarios.

Consulte también

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCancelFileOpen

FltCompletePendedPostOperation

FltDoCompletionProcessingWhenSafe

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_PRE_OPERATION_CALLBACK