Função FwpsInjectTransportSendAsync1 (fwpsk.h)
A função FwpsInjectTransportSendAsync1 injeta dados de pacote das camadas de erro de transporte, datagram ou ICMP no caminho de dados de envio. Essa função difere da versão anterior (FwpsInjectTransportSendAsync0) na medida em que usa uma estrutura de parâmetros atualizada como argumento.
Sintaxe
NTSTATUS FwpsInjectTransportSendAsync1(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT64 endpointHandle,
[in] UINT32 flags,
[in, optional] FWPS_TRANSPORT_SEND_PARAMS1 *sendArgs,
[in] ADDRESS_FAMILY addressFamily,
[in] COMPARTMENT_ID compartmentId,
[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 pode ser obtido chamando a função FwpsQueryPacketInjectionState0 quando o estado de injeção de pacote FWPS_PACKET_INJECTION_STATE é FWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
[in] endpointHandle
Um identificador que indica o ponto de extremidade de transporte de pilha no caminho de dados de envio no qual o pacote deve ser injetado. Esse identificador de ponto de extremidade é fornecido para um texto explicativo no transportEndpointHandle membro do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo do driver de texto explicativo classifyFn. Os drivers de texto explicativo devem usar o identificador fornecido para injetar pacotes clonados de volta no caminho de dados o mais rápido possível, antes que o soquete associado ao ponto de extremidade de pilha seja fechado e o identificador não se torne mais válido.
[in] flags
Esse parâmetro é reservado. Os drivers de texto explicativo devem definir esse parâmetro como zero.
[in, optional] sendArgs
Um ponteiro para um FWPS_TRANSPORT_SEND_PARAMS1 estrutura que especifica as propriedades do pacote de saída atual. Esse parâmetro pode ser NULL somente se a lista de buffers líquido a ser injetada contiver um cabeçalho IP (por exemplo, se o pacote for enviado por meio de um soquete bruto).
[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 todo o membro compartimental do FWPS_INCOMING_METADATA_VALUES0 estrutura passada para a função de texto explicativo do driver de texto explicativo classifyFn. 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, out] netBufferList
Um ponteiro para uma estrutura de NET_BUFFER_LIST que descreve os dados de pacote que estão sendo injetados. Um driver de texto explicativo aloca uma estrutura de NET_BUFFER_LIST a ser usada para injetar dados de pacote chamando o função FwpsAllocateCloneNetBufferList0 ou função FwpsAllocateNetBufferAndNetBufferList0.
[in] completionFn
Um ponteiro para um completionFn função de texto explicativo 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, foram 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 apontado pelo parâmetro completionFn. Esse parâmetro é opcional e pode ser NULL.
Valor de retorno
A função FwpsInjectTransportSendAsync1 retorna um dos seguintes códigos NTSTATUS:
Código de retorno | Descrição |
---|---|
|
A injeção de dados do 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 Status membro 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. |
Observações
Um driver explicativo chama a função FwpsInjectTransportSendAsync1 para injetar dados de pacote das camadas de erro de transporte, datagram ou ICMP no caminho de dados de envio. Nessas camadas, o cabeçalho IP pode ainda não estar formado e, quando a política IPsec está ativa, os dados do pacote não são criptografados ou assinados. Portanto, essa função é ideal para usar para inspeção de pacotes em um ambiente habilitado para IPsec.
Essa função pode ser executada de forma assíncrona.
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 líquidos apontada pelo netBufferList deve ser liberada por uma chamada para FwpsFreeNetBufferList0 ou FwpsFreeCloneNetBufferList0.
Normalmente, os drivers de texto explicativo injetam dados na pilha de rede quando modificam os dados do pacote. Para obter mais informações sobre como um driver de texto explicativo pode modificar os dados do pacote, consulte operações de driver de texto explicativo.
O pacote injetado pode ser indicado ao driver de texto explicativo novamente. Para evitar looping infinito, o driver deve primeiro chamar o função FwpsQueryPacketInjectionState0 antes de chamar a função de texto explicativo classifyFn e permitir pacotes que têm o estado de injeção FWPS_PACKET_INJECTION_STATE definido como FWPS_PACKET_INJECTED_BY_SELF ou FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
O parâmetro endpointHandle e os membros declarados no
FWPS_TRANSPORT_SEND_PARAMS1 estrutura apontada pelo parâmetro sendArgs são fornecidos para textos explicativos das seguintes camadas de rede:
- FWPS_LAYER_OUTBOUND_TRANSPORT_V4
- FWPS_LAYER_OUTBOUND_TRANSPORT_V6
- FWPS_LAYER_DATAGRAM_DATA_V4 (quando a direção de saída é especificada com FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_DATAGRAM_DATA_V6 (quando a direção de saída é especificada com FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6
O datagram pertence a um soquete bruto se ambos os seguintes forem verdadeiros:
- O currentMetadataValues membro da estrutura FWPS_INCOMING_METADATA_VALUES0 tem o sinalizador FWPS_METADATA_FIELD_IP_HEADER_SIZE definido.
- O ipHeaderSize membro da estrutura de FWPS_INCOMING_METADATA_VALUES0 é maior que zero.
Nas camadas de rede a seguir, se o datagram pertencer a um soquete bruto, você precisará copiar o cabeçalho IncludeHeader e o cabeçalho IncludeHeaderLength membros da estrutura FWPS_INCOMING_METADATA_VALUES0 para o membro correspondente da estrutura FWPS_TRANSPORT_SEND_PARAMS1 à qual o sendArgs parâmetro aponta para:
- FWPS_LAYER_DATAGRAM_DATA_V4 (quando a direção de saída é especificada com FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_DATAGRAM_DATA_V6 (quando a direção de saída é especificada com FWP_DIRECTION_OUTBOUND)
Requisitos
Requisito | Valor |
---|---|
de cliente com suporte mínimo | Disponível a partir do Windows 7. |
da Plataforma de Destino | Universal |
cabeçalho | fwpsk.h (inclua Fwpsk.h) |
biblioteca | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |