Compartir a través de


Registro de tipos de contexto

Un controlador de minifiltro debe registrar primero cada tipo de contexto que use. Una vez que un minifiltro ha registrado los tipos de contexto que usa, puede crear un contexto.

Pasos para registrar un tipo de contexto

Un minifiltro llama a FltRegisterFilter desde su rutina DriverEntry para registrar cada tipo de contexto que usa. Antes de llamar a FltRegisterFilter, el controlador de minifiltro hace lo siguiente:

  • Crea una matriz de longitud variable de FLT_CONTEXT_REGISTRATION estructuras. El orden de los elementos de esta matriz no importa; sin embargo, el último elemento de la matriz debe ser {FLT_CONTEXT_END}.
  • Almacena un puntero a la matriz creada en el miembro ContextRegistration de la estructura FLT_REGISTRATION . El minifiltro pasa esta estructura en el parámetro Registration de FltRegisterFilter.

Para cada tipo de contexto que use el controlador de minifiltro, debe proporcionar al menos una definición de contexto. La definición tiene la forma de una estructura de FLT_CONTEXT_REGISTRATION , donde cada estructura define el tipo, el tamaño y otra información para el contexto.

Cuando el controlador de minifiltro llama a FltAllocateContext para crear un nuevo contexto, el administrador de filtros usa el parámetro Size , así como los miembros Size y Flags de la estructura de FLT_CONTEXT_REGISTRATION, para seleccionar la definición de contexto que se va a usar:

  • En el caso de los contextos de tamaño fijo, el miembro Size de la estructura de FLT_CONTEXT_REGISTRATION especifica el tamaño, en bytes, de la parte de la estructura de contexto definida por el controlador de minifiltro. El tamaño máximo de un contexto es MAXUSHORT (64 KB). Cero es un valor de tamaño válido. El administrador de filtros implementa contextos de tamaño fijo mediante listas de lookaside. El administrador de filtros crea dos listas de aspecto para cada valor de tamaño: una paginada y otra no paginada.

  • En el caso de los contextos de tamaño variable, el miembro Size debe establecerse en FLT_VARIABLE_SIZED_CONTEXTS. El administrador de filtros asigna contextos de tamaño variable directamente desde un grupo paginado o no paginado.

En el miembro Flags de la estructura FLT_CONTEXT_REGISTRATION, se puede especificar la marca FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH. Si el controlador de minifiltro usa contextos de tamaño fijo y se especifica esta marca, el administrador de filtros asigna un contexto de la lista de lookaside si el tamaño del contexto es mayor o igual que el tamaño solicitado. De lo contrario, el tamaño del contexto debe ser igual al tamaño solicitado.

Para un tipo de contexto determinado, el controlador de minifiltro puede proporcionar hasta tres definiciones de contexto de tamaño fijo, cada una con un tamaño diferente y una definición de tamaño variable. Para obtener más información, consulte FLT_CONTEXT_REGISTRATION.

Rutinas de devolución de llamada de minifiltro para la administración de contextos

El controlador de minifiltro puede proporcionar opcionalmente las siguientes rutinas de devolución de llamada relacionadas con el contexto, que se almacenan en la estructura de FLT_REGISTRATION que se pasa como parámetro a FltRegisterFilter:

Rutina de devolución de llamada Descripción
PFLT_CONTEXT_ALLOCATE_CALLBACK En raras ocasiones, un minifiltro podría necesitar definir su propia rutina de devolución de llamada para asignar contextos, en lugar de basarse en el administrador de filtros.
PFLT_CONTEXT_CLEANUP_CALLBACK Se va a llamar a la rutina de limpieza de un minifiltro antes de liberar el contexto.
PFLT_CONTEXT_FREE_CALLBACK En raras ocasiones, es posible que un minifiltro deba definir su propia rutina de devolución de llamada para liberar contextos, en lugar de depender del administrador de filtros.

Ejemplo de código de registro de contexto

En el ejemplo de código siguiente, que se toma del controlador de minifiltro de ejemplo CTX, se muestra una matriz de estructuras de FLT_CONTEXT_REGISTRATION que se usan para registrar contextos de instancia, archivo, secuencia y objeto de archivo (identificador de secuencia).

const FLT_CONTEXT_REGISTRATION contextRegistration[] =
{
    { FLT_INSTANCE_CONTEXT,              //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_INSTANCE_CONTEXT_SIZE,         //Size
      CTX_INSTANCE_CONTEXT_TAG           //PoolTag
    },
    { FLT_FILE_CONTEXT,                  //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_FILE_CONTEXT_SIZE,             //Size
      CTX_FILE_CONTEXT_TAG               //PoolTag
    },
    { FLT_STREAM_CONTEXT,                //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAM_CONTEXT_SIZE,           //Size
      CTX_STREAM_CONTEXT_TAG             //PoolTag
    },
    { FLT_STREAMHANDLE_CONTEXT,          //ContextType
      0,                                 //Flags
      CtxContextCleanup,                 //ContextCleanupCallback
      CTX_STREAMHANDLE_CONTEXT_SIZE,     //Size
      CTX_STREAMHANDLE_CONTEXT_TAG       //PoolTag
    },
    { FLT_CONTEXT_END }
};