Partilhar via


Verificação de filtro do sistema de arquivos

Validação de uso

O Verificador de Filtro valida o seguinte uso em um driver de minifiltro:

  • Uso correto dos parâmetros e do contexto de chamada
  • Valores de retorno corretos de rotinas de retorno de chamada pré e pós-operação
  • Alterações consistentes e coerentes nos parâmetros nos dados de retorno de chamada

Rastreamento de objetos do Gerenciador de Filtros

O Verificador de Filtros rastreia os seguintes objetos do gerenciador de filtros:

  • Filtrar contextos (contextos de fluxo, contextos de arquivo, etc.)
  • Estruturas de dados de retorno de chamada
  • Itens de trabalho em fila
  • NomeEstruturas de informação
  • Objetos de arquivo
  • Filtrar objetos
  • Objetos de instância
  • Objetos de volume

Para estruturas de contagem de referência, como contextos de filtro e estruturas de informações de nome, o Verificador de Filtro invadirá o depurador ao descarregar o driver de filtro se alguma contagem de referência parecer ter sido vazada. Ele imprimirá instruções sobre como você pode usar a extensão do depurador !fltkd para encontrar as estruturas vazadas.

Violações do Verificador de Filtros

Quando o Verificador de Filtro detecta uma violação, ele imprime uma mensagem no depurador descrevendo a violação. Para a maioria das violações, ele também interrompe a execução e solicita que o usuário tome alguma ação. Por exemplo:

FILTER VERIFIER ERROR: A filter returned an unknown pre-operation callback status.
(Filter = FFFFAC04A21CD8A0 (MyFilter), Status = 0xbaadf00d)
Break, ignore, zap or remove ?

Para continuar, digite um dos quatro comandos de uma letra:

  • B ou b para Break: Isso invade o depurador onde você pode realizar uma investigação mais aprofundada.
  • I ou i para Ignorar: Retoma a execução. Se essa violação for encontrada novamente, o Verificador de Filtro imprimirá a mensagem de violação no depurador, interromperá a execução e exibirá o prompt.
  • Z ou z para Zap: Retoma a execução. Se essa violação for encontrada novamente, o Verificador de Filtro imprimirá a mensagem de violação no depurador, mas NÃO interromperá a execução.
  • R ou r para Remover: Retoma a execução. Se essa violação for encontrada novamente, o Verificador de Filtro NÃO imprimirá a mensagem de violação e NÃO interromperá a execução.

Observação

Ao usar o Verificador de Filtro em um driver que foi criado com otimizações de compilador habilitadas, você pode ocasionalmente encontrar um erro do Verificador de Filtro afirmando consistentemente que seu filtro vazou referências a um ou mais recursos, mesmo quando você não consegue encontrar uma causa para um vazamento em seu código. A mensagem começará com texto semelhante ao seguinte:

FILTER VERIFIER ERROR: A filter (Filter = FFFFAC04A21CD8A0 (MyFilter)) leaked references to the following resources:

Você também pode ver uma mensagem indicando que o controle de objetos está fora de sincronia, como:

FILTER VERIFIER WARNING: Filter manager verifier object tracking may be out of sync for the system

A causa mais comum dessa condição é que o Verificador de Filtro não pôde identificar o verdadeiro chamador de uma API do Gerenciador de Filtros devido a uma otimização de chamada final. Isso pode ocorrer quando uma rotina no driver chama uma API do Gerenciador de Filtros como sua última linha. Por exemplo:

void MyWorkItemCallback(PFLT_GENERIC_WORKITEM WorkItem,
                        PVOID Filter,
                        PVOID Context)
{
   // Do some stuff
   ...
   FltFreeGenericWorkItem(WorkItem);
}

Há algumas maneiras de verificar se isso aconteceu:

  1. Desative a otimização da rotina suspeita envolvendo-a no #pragma optimize("", off) ... #pragma optimize("", on).
  2. Reordene seu código para que a chamada da API do Gerenciador de Filtros não seja a última coisa que acontece em sua rotina.

Se o erro não se reproduzir mais depois de tentar uma dessas opções, é provável que seja um falso positivo.

Ativando esta opção

Você pode ativar o recurso Verificação de Filtro do Sistema de Arquivos para um ou mais drivers usando a linha de verifier.exe comando. Para obter detalhes, consulte Selecionando opções do verificador de driver.

Observação

Antes da compilação 25126 do Windows, não há suporte para habilitar a Verificação de Filtro do Sistema de Arquivos em um ou minifiltros ao mesmo tempo em que o ntoskrnl é selecionado para verificação. Isso pode resultar em erros espúrios do Verificador.

Para evitar esse problema, não inclua ntoskrnl na lista de componentes para verificar ou atualizar para uma versão do Windows após a compilação 25126.

A maneira recomendada de iniciar o Verificador de Filtro é com a opção /standard do , pois ele fornece recursos úteis adicionais, como pool especial e rastreamento de verifier.exepool:

verifier.exe /standard /driver MyFilter.sys

A verificação começa quando o driver do minifiltro se registra no gerenciador de filtros.

  • Habilitando somente o verificador de filtro no Windows 11 e versões posteriores do Windows Para habilitar o conjunto mínimo de verificações do Verificador de Filtro, habilite as opções Verificação de E/S e Verificação de Filtro do Sistema de Arquivos no Verificador de Driver (verifier.exe). Por exemplo:

    verifier.exe /ruleclasses 5 37 /driver MyFilter.sys
    
  • Habilitando somente o verificador de filtro no Windows 10 e em versões anteriores do Windows Para habilitar o conjunto mínimo de verificações do Verificador de Filtro, especifique o nome do driver do minifiltro e habilite a opção Verificação de E/S no Verificador de Driver (verifier.exe). Por exemplo:

    verifier.exe /flags 0x10 /driver MyFilter.sys