Partilhar via


Usando a Filtragem da Camada 2

Há suporte para filtragem de camada 2 em Windows 8 e versões posteriores do Windows.

Esse recurso WFP permite a filtragem em campos do cabeçalho MAC da camada 2. Essas camadas são invocadas por pacote para todos os pacotes enviados ou recebidos pelo computador host. As camadas são invocadas antes da remontagem de pacotes no caminho de entrada e após a fragmentação de pacotes no caminho de saída. Essas camadas são acessadas de um driver LWF (filtro leve NDIS).

Observação

Um texto explicativo não deve injetar pacotes em uma camada se ele ainda não tiver um filtro correspondente nessa camada. A injeção das estruturas de NET_BUFFER_LIST deve ser coordenada com a adição e a remoção do filtro para que a injeção só seja executada quando o filtro existir na camada correspondente. Além disso, os provedores não devem remover filtros que pertencem a outros provedores. 

Esta seção inclui os tópicos a seguir:

Injetando quadros MAC

Um driver de retorno de chamada chama a função FwpsInjectMacReceiveAsync0 para reinjetar um quadro MAC absorvido anteriormente (ou um clone do quadro) de volta para o caminho de dados de entrada da camada 2 do qual foi interceptado ou para injetar um quadro MAC inventado no caminho de dados de entrada.

Um driver de retorno de chamada chama a função FwpsInjectMacSendAsync0 para reinjetar um quadro MAC absorvido anteriormente (ou um clone do quadro) de volta para o caminho de dados de saída da camada 2 do qual foi interceptado ou injetar um quadro MAC inventado no caminho de dados de saída.

O parâmetro netBufferLists pode ser uma cadeia de NET_BUFFER_LIST . No entanto, a função de conclusão pode ser invocada várias vezes cada, concluindo um segmento (ou um único NET_BUFFER_LIST) da cadeia.

Os quadros injetados poderão ser classificados novamente se os pacotes corresponderem ao mesmo filtro que o classificado originalmente. Portanto, assim como acontece com os textos explicativos em camadas de IP, os textos explicativos de camada 2 também devem proteger contra inspeção infinita de pacotes chamando FwpsQueryPacketInjectionState0.

Além disso, você deve ter textos explicativos na camada em que injeta. Caso contrário, o NET_BUFFER_LIST injetado não será concluído para sua função de conclusão e o NET_BUFFER_LIST aumentará ainda mais a pilha. Nesse caso, o comportamento é indefinido, pois o NDIS tentará passar o NET_BUFFER_LIST injetado para o próximo componente na pilha.

O membro statusNET_BUFFER_LIST contém o resultado status da injeção de pilha. O resultado status da injeção de pilha é o status que a pilha coloca no NET_BUFFER_LIST depois que uma função de injeção de WFP retorna STATUS_SUCCESS. Você deve usar a macro NT_SUCCESS para marcar o status da injeção de pilha no membro Status. Se o valor status for STATUS_SUCCESS, a injeção foi bem-sucedida sem mais informações. Valores de membro de status maiores que STATUS_SUCCESS significam que a injeção foi bem-sucedida, mas pode haver mais informações sobre a injeção que devem ser consideradas. Valores de membro de status menores que STATUS_SUCCESS significam que a injeção falhou pelo motivo especificado no membro Status .

Classificando listas de buffers de rede encadeadas

Por padrão, um driver de texto explicativo só pode classificar listas de buffer de rede individualmente. No entanto, um driver de texto explicativo pode classificar cadeias de NET_BUFFER_LIST para melhor desempenho, se ele fizer o seguinte:

Aviso

No entanto, se um driver de texto explicativo definir o sinalizador FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY , ele não poderá usar as funções a seguir para modificar NET_BUFFER_LISTs.

Com esse conjunto de sinalizadores, FwpsAllocateCloneNetBufferList0 sempre retornará um erro de INVALID_PARAMETER . Isso pode fazer com que um driver de texto explicativo de terceiros falhe ao gerenciar a contagem de referência de NET_BUFFER_LISTs, fazendo com que as operações de envio e recebimento sejam interrompidas.

Camadas e campos da Camada 2 do WFP

Os identificadores de camada de filtragem em tempo de execução para filtragem de comutador virtual incluem:

FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE

FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE

Os Identificadores de Campo de Dados para filtragem de comutador virtual incluem:

FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_INBOUND_MAC_FRAME_NATIVE

FWPS_FIELDS_OUTBOUND_MAC_FRAME_NATIVE