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
- Classificando listas de buffers de rede encadeadas
- Camadas e campos da Camada 2 do WFP
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:
- Especifica o sinalizador FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY no membro Flags da estrutura FWPS_CALLOUT2 .
- Registra uma função classifyFn2 que pode classificar cadeias de NET_BUFFER_LIST .
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.
- FwpsReferenceNetBufferList0
- FwpsDereferenceNetBufferList0
- FwpsAllocateCloneNetBufferList0
- FwpsFreeCloneNetBufferList0
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