Função FwpsInjectTransportReceiveAsync0 (fwpsk.h)
A função FwpsInjectTransportReceiveAsync0 injeta dados de pacote das camadas de erro transporte, datagram ou ICMP no caminho de dados de recebimento.
Sintaxe
NTSTATUS FwpsInjectTransportReceiveAsync0(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
PVOID reserved,
[in] UINT32 flags,
[in] ADDRESS_FAMILY addressFamily,
[in] COMPARTMENT_ID compartmentId,
[in] IF_INDEX interfaceIndex,
[in] IF_INDEX subInterfaceIndex,
[in, out] NET_BUFFER_LIST *netBufferList,
[in] FWPS_INJECT_COMPLETE0 completionFn,
[in, optional] HANDLE completionContext
);
Parâmetros
[in] injectionHandle
Um identificador de injeção que foi criado anteriormente por uma chamada para o Função FwpsInjectionHandleCreate0 .
[in, optional] injectionContext
Um identificador opcional para o contexto de injeção. Se especificado, ele poderá ser obtido chamando a função FwpsQueryPacketInjectionState0 quando o estado de injeção de pacote FWPS_PACKET_INJECTION_STATE for FWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
reserved
Reservado. Os drivers de texto explicativo devem definir esse parâmetro como zero.
[in] flags
Reservado. Os drivers de texto explicativo devem definir esse parâmetro como zero.
[in] addressFamily
Uma das seguintes famílias de endereços:
AF_INET
A família de endereços IPv4.
AF_INET6
A família de endereços IPv6.
[in] compartmentId
O identificador do compartimento de roteamento no qual os dados do pacote são injetados, especificado como um tipo de COMPARTMENT_ID . Esse identificador é fornecido a um texto explicativo por meio do membro compartimental do FWPS_INCOMING_METADATA_VALUES0 estrutura que é passada para a função de texto explicativo classifyFn do driver de texto explicativo. Se o membro compartmentId estiver disponível para textos explicativos, FWPS_METADATA_FIELD_COMPARTMENT_ID será definido no membro currentMetadataValues . Caso contrário, defina esse parâmetro como UNSPECIFIED_COMPARTMENT_ID.
[in] interfaceIndex
O índice da interface na qual os dados do pacote original foram recebidos. Um driver de texto explicativo deve usar o valor do índice de interface que é passado como um dos valores de dados de entrada para sua função de texto explicativo classifyFn para esse parâmetro se o pacote deve ser injetado na mesma interface em que o pacote original foi indicado.
[in] subInterfaceIndex
O índice da subinterface na qual os dados do pacote original foram recebidos. Um driver de texto explicativo deve usar o valor do índice de subinterface que é passado como um dos valores de dados de entrada para sua função de texto explicativo classifyFn para esse parâmetro se o pacote deve ser injetado na mesma subinterface em que o pacote original foi indicado.
[in, out] netBufferList
Um ponteiro para uma estrutura NET_BUFFER_LIST que descreve os dados de pacote que estão sendo injetados. Um driver de texto explicativo aloca uma estrutura NET_BUFFER_LIST a ser usada para injetar dados de pacote chamando a função FwpsAllocateCloneNetBufferList0 ou a função FwpsAllocateNetBufferAndNetBufferList0 . A estrutura NET_BUFFER_LIST deve começar com um cabeçalho IP.
[in] completionFn
Um ponteiro para uma função de texto explicativo completionFn fornecida pelo driver de texto explicativo. O mecanismo de filtro chama essa função depois que os dados do pacote, descritos pelo parâmetro netBufferList , são injetados na pilha de rede.
[in, optional] completionContext
Um ponteiro para um contexto fornecido pelo driver de texto explicativo que é passado para a função de texto explicativo apontada pelo parâmetro completionFn . Esse parâmetro é opcional e pode ser NULL.
Retornar valor
A função FwpsInjectTransportReceiveAsync0 retorna um dos seguintes códigos NTSTATUS .
Código de retorno | Descrição |
---|---|
|
A injeção de dados de pacote foi iniciada com êxito. O mecanismo de filtro chamará a função de conclusão depois que o mecanismo de filtro tiver concluído a injeção dos dados do pacote na pilha de rede ou quando ocorrer um erro posteriormente. No caso de um erro, o membro Status da estrutura de NET_BUFFER_LIST concluída indicará o motivo da falha. |
|
A pilha de rede TCP/IP não está pronta para aceitar a injeção de dados de pacote. |
|
O identificador de injeção está sendo fechado. |
|
Ocorreu um erro. |
Comentários
Um driver de texto explicativo chama a função FwpsInjectTransportReceiveAsync0 para injetar dados de pacote das camadas de erro de transporte, datagram ou ICMP no caminho de dados de recebimento. Essa função pode ser executada de forma assíncrona. Os drivers de texto explicativo normalmente injetam dados na pilha de rede ao modificar dados de pacotes. Para obter mais informações sobre como um driver de texto explicativo pode modificar dados de pacotes, consulte Operações de driver de texto explicativo.
Se um driver de texto explicativo modificou um pacote que ele injetará com FwpsInjectTransportReceiveAsync0, ele deverá chamar o Função FwpsConstructIpHeaderForTransportPacket0 para corrigir as somas de verificação do PROTOCOLO IP e de nível superior (TCP, UDP e ICMP). O parâmetro headerIncludeHeaderSize de FwpsConstructIpHeaderForTransportPacket0 deve ser o mesmo valor que o membro ipHeaderSize do FWPS_INCOMING_METADATA_VALUES0 estrutura que é passada para o parâmetro inMetaValues da função de texto explicativo classifyFn do driver de texto explicativo.
Se o valor retornado não for STATUS_SUCCESS, a função de conclusão não será chamada. Nesse caso, a lista de buffers net apontada por netBufferList deve ser liberada por uma chamada para FwpsFreeNetBufferList0 ou FwpsFreeCloneNetBufferList0.
Se os dados originais do pacote de entrada estiverem sujeitos à imposição da política IPsec quando foram originalmente processados pela camada de transporte, o pacote clonado injetado por essa função ignorará a verificação IPsec quando ela reentre na pilha de rede. Pacotes de entrada gerados localmente que usam a função FwpsAllocateNetBufferAndNetBufferList0 também ignoram a verificação IPsec.
Para permitir que o IPsec processe pacotes de entrada primeiro, o texto explicativo que inspeciona os dados da camada de transporte deve ter um valor menor de subLayerWeight na estrutura FWPS_FILTER0 do que o subcaminho universal. Além disso, o driver de texto explicativo não deve interceptar pacotes de modo de túnel para os quais a combinação de FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 membros ( isTunnelMode && ! isDeTunneled ) é retornado pelo Função FwpsGetPacketListSecurityInformation0 . O driver de texto explicativo deve aguardar o pacote ser desativado e, em seguida, deve interceptá-lo na camada de transporte ou em uma camada de avanço.
Devido à semântica de bloqueio de protocolo TCP, o TCP só pode ser injetado fora de banda em qualquer camada de transporte ou camada equivalente, portanto, FwpsInjectTransportReceiveAsync0 e FwpsInjectTransportSendAsync0 devem ser enfileirados e executados por um DPC.
Essa função poderá ser chamada de uma das seguintes camadas de transporte se o sinalizador de metadados FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED não estiver definido:
FWPS_LAYER_INBOUND_TRANSPORT_V4
FWPS_LAYER_INBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4 (quando a direção de entrada é especificada com FWP_DIRECTION_INBOUND)
FWPS_LAYER_DATAGRAM_DATA_V6 (quando a direção de entrada é especificada com FWP_DIRECTION_INBOUND)
FWPS_LAYER_INBOUND_ICMP_ERROR_V4
FWPS_LAYER_INBOUND_ICMP_ERROR_V6
Caso contrário, essa função deve ser chamada das seguintes camadas ALE (Application Layer Enforcement) depois que uma operação ALE pendente foi iniciada com uma chamada para FwpsPendOperation0 e foi concluída com uma chamada para FwpsCompleteOperation0:
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6
Uma lista de buffers líquidos a ser injetada deve ser passada para a função FwpsCompleteOperation0 como o argumento netBufferList .
O pacote injetado pode ser indicado para o driver de texto explicativo novamente. Para evitar loop infinito, o driver deve primeiro chamar o A função FwpsQueryPacketInjectionState0 antes de prosseguir com uma chamada para a função de texto explicativo classifyFn , e o driver deve permitir que pacotes com o estado de injeção FWPS_PACKET_INJECTION_STATE definidos como FWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF passar sem alterações.
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Disponível a partir do Windows Vista. |
Plataforma de Destino | Universal |
Cabeçalho | fwpsk.h (inclua Fwpsk.h) |
Biblioteca | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |