Compartir a través de


Escribir rutinas de devolución de llamada posteriores a la operación

Un controlador minifiltro del sistema de archivos usa una o varias rutinas de devolución de llamada de postoperación para filtrar las operaciones de E/S.

Una rutina de devolución de llamada posterior a la operación puede realizar una de las siguientes acciones:

  • Realice el trabajo de finalización directamente en la rutina de postoperación. Todo el trabajo de finalización se puede realizar en IRQL <= DISPATCH_LEVEL.
  • Realice el trabajo de finalización en un IRQL seguro. Devuelve FLT_STATUS_MORE_PROCESSING_REQUIRED y pone en cola un subproceso de trabajo para permitir el procesamiento en IRQL seguro. Una vez completado el procesamiento, el subproceso de trabajo llama a FltCompletePendedPostOperation para continuar con el procesamiento posterior a la operación.
  • Cancele una operación CREATE correcta.

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

Un controlador de minifiltro registra una rutina de devolución de llamada de postoperación para un tipo determinado de operación de E/S de la misma manera que registra una rutina de devolución de llamada de preoperación, es decir, almacenando el punto de entrada de la rutina de devolución de llamada en el miembro OperationRegistration de la estructura FLT_REGISTRATION que el controlador de minifiltro pasa como parámetro a FltRegisterFilter en su rutina DriverEntry .

Los controladores de minifiltro solo reciben los tipos de operaciones de E/S para las que han registrado una rutina de devolución de llamada de preoperación o postoperación. Un controlador de minifiltro puede registrar una rutina de devolución de llamada de preoperación para un tipo determinado de operación de E/S sin registrar una devolución de llamada posterior a la operación y viceversa.

Cada rutina de devolución de llamada de postoperación se define de la siguiente manera:

typedef FLT_POSTOP_CALLBACK_STATUS 
(*PFLT_POST_OPERATION_CALLBACK) ( 
    IN OUT PFLT_CALLBACK_DATA Data, 
    IN PCFLT_RELATED_OBJECTS FltObjects, 
    IN PVOID CompletionContext, 
    IN FLT_POST_OPERATION_FLAGS Flags 
    ); 

Al igual que una rutina de finalización, se llama a una rutina de devolución de llamada posterior a la operación en IRQL <= DISPATCH_LEVEL, en un contexto de subproceso arbitrario.

Dado que se puede llamar a en IRQL = DISPATCH_LEVEL, una rutina de devolución de llamada posterior a la operación no puede llamar a rutinas de modo kernel a las que se debe llamar en un IRQL inferior, como FltLockUserBuffer o RtlCompareUnicodeString. Por el mismo motivo, las estructuras de datos que se usan en una rutina de devolución de llamada posterior a la operación deben asignarse desde un grupo no paginado.

Las situaciones siguientes son varias excepciones a la regla anterior:

  • Si la rutina de devolución de llamada de preoperación de un controlador minifiltro devuelve FLT_PREOP_SYNCHRONIZE para una operación de E/S basada en IRP, 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 rutina de devolución de llamada de preoperación.

  • La rutina de devolución de llamada de postoperación para una operación de E/S rápida se llama en IRQL = PASSIVE_LEVEL, en el mismo contexto de subproceso que la rutina de devolución de llamada de preoperación.

  • Las rutinas de devolución de llamada posteriores a la creación se llaman en IRQL = PASSIVE_LEVEL, en el contexto del subproceso que originó la operación de IRP_MJ_CREATE.

Cuando el administrador de filtros llama a una rutina de devolución de llamada posterior a la operación de devolución de llamada del controlador de minifiltro para una operación de E/S determinada, el controlador de minifiltro controla temporalmente la operación de E/S. El controlador de minifiltro conserva este control hasta que realiza una de las siguientes acciones:

  • Devuelve FLT_POSTOP_FINISHED_PROCESSING de la rutina de devolución de llamada de postoperación.

  • Llama a FltCompletePendedPostOperation desde una rutina de trabajo que ha procesado una operación de E/S basada en IRP que se ha incrustado en la rutina de devolución de llamada de postoperación.

Esta sección incluye:

Realización del procesamiento de finalización para una operación de E/S

Pendiente de una operación de E/S en una rutina de devolución de llamada posterior a la operación

Error de una operación de E/S en una rutina de devolución de llamada posterior a la operación