Compartilhar via


Considerações sobre programação de driver de callout

Considere os tópicos a seguir ao desenvolver um driver de callout da Plataforma de Filtragem do Windows.

Modo de Usuário vs. Modo Kernel

Se a filtragem desejada puder ser feita usando a funcionalidade de filtragem padrão que está integrada à Plataforma de Filtragem do Windows, os ISVs (fornecedores de software independentes) devem escrever aplicativos de gerenciamento de modo de usuário para configurar o mecanismo de filtro em vez de escrever drivers de callout em modo kernel. Um driver de callout em modo kernel só deve ser escrito quando for necessário processar os dados de rede de maneiras que não podem ser tratadas pela funcionalidade de filtragem interna padrão. Para obter informações sobre como escrever um aplicativo de gerenciamento da Plataforma de Filtragem do Windows no modo de usuário, consulte a documentação da Plataforma de Filtragem do Windows no SDK do Microsoft Windows.

Escolha da camada de filtragem

Um driver de chamada deve filtrar os dados de rede na camada de rede mais alta possível na pilha de rede. Por exemplo, se a tarefa de filtragem desejada puder ser tratada na camada de fluxo, ela não deverá ser implementada na camada de rede. Para obter mais informações sobre as recomendações das camadas de filtragem que o driver deve usar para garantir a compatibilidade com o IPsec no Windows, consulte Desenvolvendo drivers de callout IPsec-Compatible.

Bloqueio nas camadas estabelecidas do fluxo ALE (Application Layer Enforcement)

Normalmente, se um callout tiver sido adicionado ao mecanismo de filtro em uma das camadas de filtragem do fluxo ALE estabelecido (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 ou FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), sua função de callout classifyFn nunca deverá retornar FWP_ACTION_BLOCK como ação. Uma decisão de autorizar ou rejeitar uma conexão não deve ser tomada em uma das camadas de filtragem estabelecidas pelo fluxo ALE. Essa decisão sempre deve ser tomada em uma das outras camadas de filtragem ALE.

O único motivo válido para essa função de chamada classifyFn retornar FWP_ACTION_BLOCK para a ação é se ocorrer um erro que possa representar um potencial risco de segurança se a conexão estabelecida não for encerrada. Nesse caso, retornar FWP_ACTION_BLOCK para a ação fecha a conexão para impedir que o risco potencial de segurança seja explorado.

Tempo de execução da função de chamada

Como o mecanismo de filtro geralmente chama as funções de callout de um callout em IRQL = DISPATCH_LEVEL, certifique-se de que estas funções completem sua execução o mais rápido possível para manter o sistema funcionando com eficiência. A execução estendida em IRQL = DISPATCH_LEVEL pode afetar negativamente o desempenho geral do sistema.

Injetando no caminho de recepção de dados

Os textos explicativos devem recalcular somas de verificação de IP antes de chamarem funções de injeção de pacote que injetam no caminho de dados de recebimento porque a soma de verificação no pacote original pode não estar correta quando o pacote é remontado de fragmentos de pacote IP. Não há nenhum mecanismo confiável que indique se uma lista de buffers de rede é remontada a partir de fragmentos.

Injeção embutida de pacote TCP de camadas de transporte

Devido ao comportamento de bloqueio da pilha TCP, um callout na camada de transporte não pode injetar um pacote TCP novo ou clonado a partir da função de callout classifyFn. Se a injeção embutida for desejada, o callout deve enfileirar um DPC para executar a injeção.

Alinhamento do cabeçalho IP de saída

O MDL que descreve o cabeçalho IP em uma lista de buffers de rede (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) deve ser alinhado por ponteiros quando se usa uma das funções de injeção de pacote para injetar dados de pacote em um caminho de saída. Como o MDL do cabeçalho IP de um pacote de entrada pode estar alinhado ao ponteiro, um módulo deve reconstruir o cabeçalho IP (se ainda não estiver alinhado) ao injetar um pacote de entrada em um caminho de saída.

Drivers de texto explicativo da plataforma de filtragem do Windows