Establecer contextos

Después de crear un nuevo contexto, un controlador de minifiltro puede adjuntarlo a un objeto llamando a una de las siguientes rutinas de conjunto:

La rutina set hace lo siguiente, en función del valor del parámetro Operation :

  • Si operation == FLT_SET_CONTEXT_KEEP_IF_EXISTS:

    • Si el minifiltro aún no ha establecido un contexto del mismo tipo para el objeto, establezca la rutina:
      • Adjunta el contexto recién asignado al objeto .
      • Incrementa el recuento de referencias.
    • De lo contrario, si el minifiltro ya ha establecido un contexto, la rutina establecida:
      • Devuelve STATUS_FLT_CONTEXT_ALREADY_DEFINED (un código de error NTSTATUS).
      • No reemplaza el contexto existente.
      • No incrementa el recuento de referencias.
      • Almacena un puntero al contexto existente en el parámetro OldContext si no es NULL. Cuando este puntero ya no es necesario, el controlador de minifiltro debe liberarlo llamando a FltReleaseContext.
  • Si operation == FLT_SET_CONTEXT_REPLACE_IF_EXISTS:

    • La rutina set siempre adjunta el nuevo contexto al objeto .
    • Si el controlador de minifiltro ya ha establecido un contexto, establezca la rutina:
      • Elimina el contexto existente, establece el nuevo contexto e incrementa el recuento de referencias en el nuevo contexto.
      • Si el parámetro OldContext no es NULL, recibe un puntero al contexto eliminado. Cuando este puntero ya no es necesario, el controlador de minifiltro debe liberarlo llamando a FltReleaseContext.

Una vez establecido un tipo de contexto, un minifiltro puede obtener un contexto durante las operaciones de E/S posteriores para determinar si necesita realizar alguna acción.

Todos los conjuntos de contexto correctos deben eliminarse finalmente.

En el ejemplo de código siguiente, tomado del minifiltro de ejemplo CTX, la rutina CtxInstanceSetup crea y establece un contexto de instancia:

status = FltAllocateContext(
           FltObjects->Filter,              //in: Filter
           FLT_INSTANCE_CONTEXT,            //in: ContextType
           CTX_INSTANCE_CONTEXT_SIZE,       //in: ContextSize
           NonPagedPool,                    //in: PoolType
           &instanceContext);               //out: ReturnedContext
...
status = FltSetInstanceContext(
           FltObjects->Instance,            //in: Instance
           FLT_SET_CONTEXT_KEEP_IF_EXISTS,  //in: Operation
           instanceContext,                 //in: NewContext
           NULL);                           //out: OldContext

if (instanceContext != NULL) {
  FltReleaseContext(instanceContext);
}
return status;

Tenga en cuenta que después de la llamada a FltSetInstanceContext, hay una llamada a FltReleaseContext para liberar el recuento de referencias establecido por FltAllocateContext (no FltSetInstanceContext). Esto se explica en Liberar contextos.