Excluindo contextos

Todos os contextos definidos por uma chamada bem-sucedida para Contexto XxxfltSet devem eventualmente ser excluídos.

O gerenciador de filtros exclui automaticamente os contextos quando ocorrem as seguintes situações:

  • Os objetos aos quais os contextos estão anexados são excluídos
  • Uma instância de minifiltro é desanexada de um volume
  • O driver de minifiltro é descarregado

Portanto, raramente é necessário que um minifiltro exclua explicitamente um contexto.

Um minifiltro pode excluir um contexto chamando uma das seguintes rotinas de exclusão de contexto:

Um contexto só poderá ser excluído se estiver definido para um objeto no momento. Um contexto não poderá ser excluído se ainda não tiver sido definido ou se ele já tiver sido substituído por uma chamada bem-sucedida para o ContextoXxxdo FltSet.

As rotinas de Contexto FltDeleteXxx retornam um ponteiro para o contexto antigo no parâmetro OldContext, se OldContext não for NULL e não apontar para NULL_CONTEXT. Se OldContext for NULL, o gerenciador de filtros diminuirá a contagem de referência no contexto, que será liberado, a menos que o minifiltro tenha uma referência pendente.

O exemplo de código a seguir mostra como excluir um contexto de fluxo:

status = FltDeleteStreamContext(
 FltObjects->Instance,      //Instance
 FltObjects->FileObject,    //FileObject
           &oldContext);              //OldContext
//
// Perform any needed processing
// ...
//
if (oldContext != NULL) {
 FltReleaseContext(oldContext);
}

Neste exemplo, FltDeleteStreamContext:

  • Remove o contexto de fluxo do fluxo.
  • Não diminui a contagem de referência do contexto, porque o parâmetro OldContext não é NULL.
  • Retorna o endereço do contexto excluído (o contexto removido do fluxo) no parâmetro OldContext .

Devido ao parâmetro OldContext não NULL, depois de executar qualquer processamento necessário, o filtro deve liberar o contexto excluído chamando FltReleaseContext.