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 }
};