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

Una rutina de PFLT_PRE_OPERATION_CALLBACK del controlador minifiltro realiza el procesamiento previo al funcionamiento para las operaciones de E/S.

Sintaxis

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

Parámetros

[in, out] Data

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

[in] FltObjects

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

[out] CompletionContext

Si esta rutina de devolución de llamada devuelve FLT_PREOP_SUCCESS_WITH_CALLBACK o FLT_PREOP_SYNCHRONIZE, este parámetro es un puntero de contexto opcional que se pasará a la rutina de devolución de llamada posterior a la operación correspondiente. De lo contrario, debe ser NULL.

Valor devuelto

Esta rutina de devolución de llamada devuelve uno de los siguientes valores de FLT_PREOP_CALLBACK_STATUS.

Código devuelto Descripción
FLT_PREOP_COMPLETE El minifiltro está completando la operación de E/S. Para obtener información detallada, vea la sección Comentarios de.
FLT_PREOP_DISALLOW_FASTIO La operación es una operación de E/S rápida y el minifiltro no permite usar la ruta de acceso de E/S rápida para esta operación. Para obtener información detallada, vea la sección Comentarios de.
FLT_PREOP_PENDING El minifiltro ha activado la operación de E/S y la operación sigue pendiente. Para obtener información detallada, vea la sección Comentarios de.
FLT_PREOP_SUCCESS_NO_CALLBACK El minifiltro devuelve la operación de E/S a FltMgr para su posterior procesamiento. En este caso, FltMgr no llamará a la devolución de llamada posterior al controlador de minifiltro, si existe, durante la finalización de E/S.
FLT_PREOP_SUCCESS_WITH_CALLBACK El minifiltro devuelve la operación de E/S a FltMgr para su posterior procesamiento. En este caso, FltMgr llama a la devolución de llamada posterior a la operación del minifiltro durante la finalización de E/S.
FLT_PREOP_SYNCHRONIZE El minifiltro devuelve la operación de E/S a FltMgr para su posterior procesamiento, pero no completa la operación. Para obtener información detallada, vea la sección Comentarios de.
FLT_PREOP_DISALLOW_FSFILTER_IO El minifiltro permite una operación QueryOpen rápida y fuerza la operación hacia abajo en la ruta de acceso lenta. Al hacerlo, el administrador de E/S atenderá la solicitud realizando una apertura, consulta o cierre del archivo. Los controladores minifiltros solo deben devolver este estado para QueryOpen.

Comentarios

Consulte Escritura de rutinas de devolución de llamada de operación previa para obtener información adicional.

La rutina de devolución de llamada previa a la operación de un minifiltro procesa uno o varios tipos de operaciones de E/S. (Esta rutina de devolución de llamada es similar a una rutina de distribución en el modelo de filtro heredado).

Un minifiltro registra una rutina de devolución de llamada previa 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 de FLT_REGISTRATION . El minifiltro pasa esta estructura como parámetro a FltRegisterFilter en su rutina DriverEntry . Un minifiltro puede registrar una rutina de devolución de llamada previa a la operación para un tipo determinado de operación de E/S sin registrar una rutina de devolución de llamada posterior a la operación (PFLT_POST_OPERATION_CALLBACK) y viceversa.

Una rutina de devolución de llamada del controlador minifiltro o posterior a la operación puede modificar el contenido de la estructura de datos de devolución de llamada para la operación. Si es así, debe llamar a FltSetCallbackDataDirty, a menos que haya cambiado el contenido del campo IoStatus de la estructura de datos de devolución de llamada.

El IRQL de esta rutina de devolución de llamada genérica depende de sus rutas de acceso de E/S específicas. Puede llamar rápidamente y barato a KeGetCurrentIRQL si necesita conocer el IRQL actual. Consulte Escritura de rutinas de devolución de llamada previas a la operación para obtener información adicional sobre IRQL.

Los sistemas de archivos redondeen las operaciones de escritura y lectura al final del archivo en un múltiplo del tamaño del sector del dispositivo de almacenamiento de archivos subyacente. Al procesar operaciones de lectura previa o escritura previa, los filtros que asignan y intercambian búferes deben redondear el tamaño de un búfer asignado hasta un múltiplo del tamaño del sector del dispositivo asociado. Si no lo hacen, la longitud de los datos transferidos desde el sistema de archivos subyacente superará la longitud asignada del búfer. Para obtener más información sobre el intercambio de búferes, consulte el ejemplo de minifiltro SwapBuffers.

A partir de Windows 8, CompletionContext usa la anotación Flt_CompletionContext_Outptr que define valores de contexto válidos en función del resultado de la operación. A continuación se muestra un ejemplo de uso para la devolución de llamada con la anotación de CompletionContext.

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


Devolver FLT_PREOP_COMPLETE

Si esta rutina devuelve FLT_PREOP_COMPLETE, debe establecer el campo IoStatus.Status de la estructura de datos de devolución de llamada en el valor NTSTATUS final para la operación de E/S. Este valor NTSTATUS no puede ser STATUS_PENDING. Para una operación de limpieza o cierre, debe ser un valor NTSTATUS correcto distinto de STATUS_PENDING porque no se pueden producir errores en las operaciones de limpieza y cierre.

Cuando esta rutina devuelve FLT_PREOP_COMPLETE, FltMgr no enviará la operación de E/S a ningún controlador de minifiltro por debajo del autor de la llamada en la pila de controladores o al sistema de archivos. En este caso, FltMgr solo llama a las rutinas de devolución de llamada posteriores a la operación de los controladores de minifiltro por encima del autor de la llamada en la pila de controladores.

Devolver FLT_PREOP_DISALLOW_FASTIO

Si esta rutina devuelve FLT_PREOP_DISALLOW_FASTIO, no debe establecer el campo IoStatus.Status de la estructura de datos de devolución de llamada porque FltMgr establece automáticamente este campo en STATUS_FLT_DISALLOW_FAST_IO.

FLT_PREOP_DISALLOW_FASTIO solo se puede devolver para una operación de E/S rápida. Para determinar si una estructura de datos de devolución de llamada determinada representa una operación de E/S rápida, use la macro FLT_IS_FASTIO_OPERATION .

Cuando esta rutina devuelve FLT_PREOP_DISALLOW_FASTIO, FltMgr no enviará la operación de E/S rápida a ningún controlador de minifiltro por debajo del autor de la llamada en la pila de controladores o al sistema de archivos. En este caso, FltMgr solo llama a las rutinas de devolución de llamada posteriores a la operación de los controladores de minifiltro por encima del autor de la llamada en la pila de controladores.

Devolver FLT_PREOP_PENDING

FLT_PREOP_PENDING solo se puede devolver para las operaciones de E/S basadas en IRP porque solo se pueden lápiz 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 .

Cuando esta rutina devuelve FLT_PREOP_PENDING, FltMgr no procesará aún más la operación de E/S hasta que el controlador de minifiltro llame a FltCompletePendedPreOperation.

Devolver FLT_PREOP_SYNCHRONIZE

Si la rutina de devolución de llamada previa a la operación de un minifiltro devuelve FLT_PREOP_SYNCHRONIZE, el minifiltro debe haber registrado una devolución de llamada posterior a la operación correspondiente. Cuando esta rutina devuelve FLT_PREOP_SYNCHRONIZE, FltMgr llama a la devolución de llamada posterior al minifiltro en el contexto del subproceso actual en IRQL <= APC_LEVEL.

FLT_PREOP_SYNCHRONIZE solo se debe devolver para las operaciones de E/S basadas en IRP. Si se devuelve para una operación de E/S que no es una operación basada en IRP, FltMgr trata este valor devuelto como si fuera FLT_PREOP_SUCCESS_WITH_CALLBACK.

Los controladores de minifiltro no deben devolver FLT_PREOP_SYNCHRONIZE para las operaciones de creación, ya que fltMgr ya sincroniza estas operaciones.

Los minifiltros nunca deben devolver FLT_PREOP_SYNCHRONIZE para las operaciones asincrónicas de lectura y escritura. Si lo hace, puede degradar gravemente tanto el controlador de minifiltro como el rendimiento del sistema.

Requisitos

Requisito Value
Cliente mínimo compatible Paquete acumulativo de actualizaciones de Microsoft Windows 2000 1 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

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr

KeGetCurrentIRQL