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:
- FltSupportsFileContexts ou FltSupportsFileContextsEx
- FltSupportsStreamContexts
- FltSupportsStreamHandleContexts
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 .