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 |
---|---|
|
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. |
|
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:
|
|
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
FltCompletePendedPostOperation