Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Considere os seguintes tópicos ao programar 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 incorporada à Plataforma de Filtragem do Windows, os fornecedores independentes de software (ISVs) deverão escrever aplicativos de gestão em modo de utilizador para configurar o motor de filtragem, em vez de escrever drivers de callout em modo kernel. Deve-se escrever um driver de callout em modo kernel somente quando for necessário processar os dados de rede de formas que não possam ser tratadas pela funcionalidade de filtragem padrão integrada. 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 interceptação deve filtrar os dados de rede na camada de filtragem mais elevada possível na pilha de rede. Por exemplo, se a tarefa de filtragem desejada puder ser manipulada na camada de fluxo, ela não deverá ser implementada na camada de rede. Para obter mais informações sobre recomendações das camadas de filtragem que seu driver deve usar para garantir a compatibilidade com IPsec no Windows, consulte Developing IPsec-Compatible Callout Drivers.
Bloqueio de nas camadas estabelecidas do fluxo de aplicação de camada de aplicação (ALE)
Normalmente, se um texto explicativo tiver sido adicionado ao mecanismo de filtro em uma das fluxo ALE estabelecido camadas de filtragem (FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 ou FWPM_LAYER_ALE_FLOW_ESTABLISHED_V6), sua função de texto explicativoclassifyFn nunca deverá retornar FWP_ACTION_BLOCK para a 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. Tal decisão deve ser sempre tomada em uma das outras camadas de filtragem ALE.
A única razão válida para tal função de texto explicativo classifyFn retornar FWP_ACTION_BLOCK para a ação é se ocorrer um erro que possa representar um risco potencial 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 evitar que o risco potencial de segurança seja explorado.
Tempo de execução da função de chamada
Como o mecanismo de filtro normalmente chama as funções de callout do callout em IRQL = DISPATCH_LEVEL, certifique-se de que essas funções concluam a sua execução o mais rápido possível para manter o sistema a funcionar eficientemente. A execução estendida em IRQL = DISPATCH_LEVEL pode afetar adversamente o desempenho geral do sistema.
Injetando no caminho de dados de recebimento
As chamadas devem recalcular as somas de verificação IP antes de chamar as funções de injeção de pacotes que injetam no caminho de dados de receção, pois a soma de verificação no pacote original pode não estar correta quando o pacote é remontado a partir de fragmentos de pacotes IP. Não há nenhum mecanismo de forma confiável que indique se uma lista de buffer de rede é recomposta a partir de fragmentos.
Injeção direta de pacote TCP a partir das camadas de transporte
Devido ao comportamento de bloqueio da pilha TCP, um callout na camada de transporte não pode injetar um novo pacote TCP ou um pacote TCP clonado a partir da função callout classifyFn. Se a injeção em linha for desejada, o texto explicativo 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 numa lista de buffer de rede (NET_BUFFER_CURRENT_MDL(NET_BUFFER_LIST_FIRST_NB(netBufferList))) deve ser alinhado com o ponteiro quando uma das funções de injeção de pacotes é usada para injetar dados de pacote num caminho de saída. Como o MDL do cabeçalho IP de um pacote de entrada pode estar alinhado por ponteiro, é necessário que uma chamada reconstruir o cabeçalho IP (se ainda não estiver alinhado) ao injetar um pacote de entrada em um caminho de saída.