Compartilhar via


Criando contextos

Depois que um minifiltro tiver registrado os tipos de contexto que ele usa, ele poderá criar um contexto chamando FltAllocateContext. Essa rotina seleciona a definição de contexto apropriada a ser usada de acordo com os critérios descritos em Registrar tipos de contexto.

Antes de alocar um contexto e tentar defini-lo, um minifiltro pode chamar as seguintes rotinas para determinar se o sistema de arquivos subjacente dá suporte a contextos de identificador de arquivo, fluxo ou fluxo:

No exemplo de código a seguir, obtido do driver de minifiltro de exemplo CTX , a rotina CtxInstanceSetup chama FltAllocateContext para criar um contexto de instância:

status = FltAllocateContext(
      FltObjects->Filter,           //Filter
      FLT_INSTANCE_CONTEXT,         //ContextType
      CTX_INSTANCE_CONTEXT_SIZE,    //ContextSize
      NonPagedPool,                 //PoolType
      &instanceContext);            //ReturnedContext

No exemplo ctx, a seguinte definição de contexto é registrada para contextos de instância:

{ FLT_INSTANCE_CONTEXT,              //ContextType
  0,                                 //Flags
  CtxContextCleanup,                 //ContextCleanupCallback
  CTX_INSTANCE_CONTEXT_SIZE,         //Size
  CTX_INSTANCE_CONTEXT_TAG },        //PoolTag

A definição de contexto é de tamanho fixo porque o membro Size é CTX_INSTANCE_CONTEXT_SIZE (versus FLT_VARIABLE_SIZED_CONTEXTS, que é usado para indicar uma definição de contexto de tamanho variável). Observe que o sinalizador FLTFL_CONTEXT_REGISTRATION_NO_EXACT_SIZE_MATCH não está definido no membro Flags . Nesse caso, se o valor do parâmetro ContextSize de FltAllocateContext corresponder ao membro Size da definição de contexto, FltAllocateContext alocará o contexto da instância da lista lookaside nãopagada apropriada. Se os valores não corresponderem, FltAllocateContext falhará com um valor retornado de STATUS_FLT_CONTEXT_ALLOCATION_NOT_FOUND.

Em caso de êxito, FltAllocateContext inicializa a contagem de referência no novo contexto para um. Quando o contexto não for mais necessário, o driver de minifiltro deverá liberar essa referência. Portanto, cada chamada para FltAllocateContext deve ser correspondida por uma chamada subsequente para FltReleaseContext.

Depois que um contexto é criado, um minifiltro pode defini-lo para um objeto .