Referenciando contextos
O Gerenciador de Filtros usa a contagem de referências para gerenciar o tempo de vida de um contexto de minifiltro. Uma contagem de referência é um número que indica o estado de um contexto.
Sempre que um contexto é criado com êxito, o FltMgr inicializa a contagem de referência do contexto para um. Isso é chamado de referência inicial ao contexto.
Sempre que um contexto é referenciado, por exemplo, por um conjunto de contexto ou get bem-sucedido, o FltMgr incrementa a contagem de referência do contexto por um.
Quando um contexto não é mais necessário, sua contagem de referência deve ser decrementada. Uma contagem de referência positiva significa que o contexto é utilizável. Quando a contagem de referência se torna zero, o contexto é inutilizável e o FltMgr eventualmente a libera.
O FltMgr libera a referência inicial ao contexto (diminui a contagem de referência para zero) quando o objeto está sendo dividido e, em seguida, chama o retorno de chamada de limpeza de contexto opcional do filtro. Embora isso raramente ocorra, se um minifiltro precisar remover um contexto de um objeto antes do teardown, o minifiltro deverá liberar com segurança essa referência inicial ao contexto chamando FltDeleteContext.
Um minifiltro pode adicionar sua própria referência a um contexto chamando FltReferenceContext para incrementar a contagem de referência do contexto. O minifiltro deve eventualmente remover essa referência adicionada chamando FltReleaseContext.
Veja a seguir um pequeno exemplo de histórico de contagem de referência para um objeto típico. Suponha que todas as chamadas à API flt tenham êxito.
Filtrar retorno de chamada | API flt chamada | Contagem de referência de contexto | Descrição |
---|---|---|---|
Pré-Criar | FltAllocateContext | 1 | O filtro está processando uma pré-criação e decide que talvez queira acompanhar o arquivo. Ele aloca um contexto de fluxo, o que faz com que o FltMgr inicialize a contagem de referência como 1. O filtro passa o contexto para o retorno de chamada PostCreate por meio do parâmetro CompletionContext . |
PostCreate | FltSetStreamContext | 2 | O filtro passou o contexto alocado durante PreCreate para seu retorno de chamada PostCreate . A criação foi bem-sucedida, de modo que o filtro anexa o contexto, o que faz com que o FltMgr incremente a contagem de referência. |
PostCreate | FltReleaseContext | 1 | Como FltSetStreamContext incrementou a contagem de referência, o filtro precisa remover a contagem extra. A contagem de referência é 1 depois que o filtro libera o contexto, portanto, o contexto permanece ativo. Se o filtro decidisse que não se importava com esse arquivo, ele poderia ter ignorado a chamada de FltSetStreamContext e simplesmente chamado FltReleaseContext. Nesse caso, a contagem teria ido para 0 e o contexto teria sido desalocado. |
PreRead | FltGetStreamContext | 2 | O filtro vê uma E/S de leitura e deseja saber se está rastreando esse arquivo. Ele solicita seu contexto de fluxo e o obtém, para que ele saiba que deseja rastrear esse arquivo. FltMgr incrementa a contagem de referência. |
PreRead | FltReleaseContext | 1 | O filtro é feito usando seu contexto, portanto, ele o libera, fazendo com que a contagem de referência seja decrementada. Cada Contexto FltGet* precisa ser equilibrado com um FltReleaseContext. |
Pré-limpeza | FltGetStreamContext | 2 | O filtro solicita e obtém seu contexto, o que incrementa a contagem de referência. |
Pré-limpeza | FltReleaseContext | 1 | O filtro é feito usando o contexto para liberá-lo, o que diminui a contagem de referências. |
Retorno de chamada de limpeza de contexto | 0 | O sistema de arquivos está derrubando o objeto de fluxo subjacente. (No caso específico de um objeto de fluxo, o teardown é disparado por IRP_MJ_CLOSE). O FltMgr diminui a contagem de referência para 0 e, em seguida, chama o retorno de chamada de limpeza de contexto do filtro. O filtro agora tem a oportunidade de limpo seu contexto. |