Compartir a través de


Registrar rutinas de devolución de llamada de preoperación y postoperación

Para registrar rutinas de devolución de llamada de preoperación y rutinas de devolución de llamada posteriores a la operación, un controlador de minifiltro realiza una sola llamada a FltRegisterFilter en su rutina DriverEntry . Para el parámetro Registration en FltRegisterFilter, el controlador de minifiltro pasa un puntero a una estructura de FLT_REGISTRATION . El miembro OperationRegistration de esta estructura contiene un puntero a una matriz de estructuras de FLT_OPERATION_REGISTRATION , una para cada tipo de operación de E/S que el controlador de minifiltro debe filtrar.

Cada FLT_OPERATION_REGISTRATION estructura de la matriz, excepto la última, contiene la siguiente información:

  • Código de función principal para la operación. Consulte FLT_PARAMETERS para obtener información sobre las operaciones de E/S y sus parámetros específicos del tipo de solicitud.

  • Para las operaciones de lectura y escritura (IRP_MJ_READ y IRP_MJ_WRITE), un conjunto de marcas que especifican si se omitirá la E/S almacenada en caché o la E/S de paginación o ambas para las operaciones de E/S basadas en IRP.

  • Puntos de entrada para hasta una rutina de devolución de llamada de preoperación y una rutina de devolución de llamada posterior a la operación

El último elemento de la matriz debe ser {IRP_MJ_OPERATION_END}.

En el ejemplo de código siguiente, que se toma del controlador de minifiltro de ejemplo scanner, se muestra una matriz de estructuras de FLT_OPERATION_REGISTRATION. El controlador de minifiltro de ejemplo scanner registra rutinas de devolución de llamada de preoperación y postoperación para IRP_MJ_CREATE y rutinas de devolución de llamada de preoperación para IRP_MJ_CLEANUP y operaciones de IRP_MJ_WRITE.

const FLT_OPERATION_REGISTRATION Callbacks[] = {
    {IRP_MJ_CREATE,
     0,
     ScannerPreCreate,
     ScannerPostCreate},
    {IRP_MJ_CLEANUP,
     0, 
     ScannerPreCleanup,
     NULL},
    {IRP_MJ_WRITE,
     0, 
     ScannerPreWrite,
     NULL},
    {IRP_MJ_OPERATION_END}
};