Функция FwpsInjectTransportSendAsync1 (fwpsk.h)

Функция FwpsInjectTransportSendAsync1 внедряет данные пакетов из транспортных данных, данных датаграммы или уровней ошибок ICMP в путь отправки данных. Эта функция отличается от предыдущей версии (FwpsInjectTransportSendAsync0), так как она принимает обновленную структуру параметров в качестве аргумента.

Обратите внимание, что FwpsInjectTransportSendAsync1 — это конкретная версия FwpsInjectTransportSendAsync, используемая в Windows 7 и более поздних версиях. Дополнительные сведения см. в разделе МПП Version-Independent имен и целевых версий Windows . Для Windows Vista доступен FwpsInjectTransportSendAsync0 .
 

Синтаксис

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
);

Параметры

[in] injectionHandle

Дескриптор внедрения, созданный ранее вызовомФункция FwpsInjectionHandleCreate0.

[in, optional] injectionContext

Необязательный дескриптор контекста внедрения. Если этот параметр указан, его можно получить, вызвав функцию FwpsQueryPacketInjectionState0 , если состояние внедрения пакета FWPS_PACKET_INJECTION_STATEFWPS_PACKET_INJECTED_BY_SELF или FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.

[in] endpointHandle

Дескриптор, указывающий конечную точку транспорта стека в пути отправки данных, в которую необходимо внедрить пакет. Этот дескриптор конечной точки предоставляется выноске через элемент transportEndpointHandle элемента FWPS_INCOMING_METADATA_VALUES0 структуру, которая передается в функцию выноски драйвера classifyFn . Драйверы выноски должны использовать предоставленный дескриптор для вставки клонированных пакетов обратно в путь к данным как можно скорее до закрытия сокета, связанного с конечной точкой стека, и дескриптор становится недействительным.

[in] flags

Этот параметр зарезервирован. Драйверы выноски должны присвоить этому параметру нулевое значение.

[in, optional] sendArgs

Указатель на FWPS_TRANSPORT_SEND_PARAMS1 структура, указывающая свойства текущего исходящего пакета. Этот параметр может иметь значение NULL , только если список чистых буферов, который необходимо внедрить, содержит заголовок IP -адреса (например, если пакет отправляется через необработанный сокет).

[in] addressFamily

Одно из следующих семейств адресов:

AF_INET

Семейство адресов IPv4.

AF_INET6

Семейство адресов IPv6.

[in] compartmentId

Идентификатор секции маршрутизации, в которую внедряются данные пакета, задается в виде типа COMPARTMENT_ID . Этот идентификатор предоставляется выноске через член compartmentId элемента FWPS_INCOMING_METADATA_VALUES0 структуру, которая передается в функцию выноски драйвера classifyFn . Если член compartmentId доступен для выносок, FWPS_METADATA_FIELD_COMPARTMENT_ID будет задан в текущем элементеMetadataValues . В противном случае задайте для этого параметра значение UNSPECIFIED_COMPARTMENT_ID.

[in, out] netBufferList

Указатель на структуру NET_BUFFER_LIST , описывающую внедряемые данные пакета. Драйвер выноски выделяет структуру NET_BUFFER_LIST для внедрения данных пакетов путем вызова либо Функция FwpsAllocateCloneNetBufferList0 или Функция FwpsAllocateNetBufferAndNetBufferList0 .

[in] completionFn

Указатель на функцию выноски completionFn , предоставляемую драйвером выноски. Модуль фильтрации вызывает эту функцию после того, как данные пакета, описанные параметром netBufferList , были внедрены в сетевой стек.

[in, optional] completionContext

Указатель на предоставленный драйвером выноски контекст, который передается в функцию выноски, на которую указывает параметр completionFn . Этот параметр является необязательным и может иметь значение NULL.

Возвращаемое значение

Функция FwpsInjectTransportSendAsync1 возвращает один из следующих кодов NTSTATUS:

Код возврата Описание
STATUS_SUCCESS
Внедрение данных пакета было инициировано успешно. Подсистема фильтрации вызовет функцию завершения после завершения внедрения данных пакета в сетевой стек или при возникновении ошибки. В случае ошибки член состояния завершенной структуры NET_BUFFER_LIST указывает причину сбоя.
STATUS_FWP_TCPIP_NOT_READY
Сетевой стек TCP/IP не готов принять внедрение данных пакетов.
STATUS_FWP_INJECT_HANDLE_CLOSING
Дескриптор внедрения закрывается.
Другие коды состояния
Произошла ошибка.

Remarks

Драйвер выноски вызывает функцию FwpsInjectTransportSendAsync1 для внедрения данных пакетов из транспорта, данных датаграммы или уровней ошибок ICMP в путь отправки данных. На этих уровнях заголовок IP-адреса может быть еще не сформирован, и когда политика IPsec активна, данные пакета не шифруются и не подписываются. Поэтому эта функция идеально подходит для проверки пакетов в среде с поддержкой IPsec.

Эта функция может выполняться асинхронно.

Если возвращаемое значение не STATUS_SUCCESS, функция завершения не будет вызвана. В этом случае список чистого буфера, на который указывает netBufferList , должен быть освобожден вызовом FwpsFreeNetBufferList0 или FwpsFreeCloneNetBufferList0.

Драйверы выносок обычно внедряют данные в сетевой стек при изменении данных пакетов. Дополнительные сведения о том, как драйвер выноски может изменять данные пакетов, см. в разделе "Операции драйвера выноски".

Внедренный пакет можно снова указать драйверу выноски. Чтобы предотвратить бесконечный цикл, драйвер должен сначала вызватьФункция FwpsQueryPacketInjectionState0 перед вызовом функции выноски classifyFn и разрешение пакетов с состоянием внедрения FWPS_PACKET_INJECTION_STATE иметь значение FWPS_PACKET_INJECTED_BY_SELF или FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.

Параметр endpointHandle и члены, объявленные в
FWPS_TRANSPORT_SEND_PARAMS1 структура, на которую указывает параметр sendArgs , предоставляется выноскам из следующих сетевых слоев:

FWPS_LAYER_OUTBOUND_TRANSPORT_V4
FWPS_LAYER_OUTBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4 (при указании направления исходящего трафика с помощью FWP_DIRECTION_OUTBOUND)
FWPS_LAYER_DATAGRAM_DATA_V6 (при указании направления исходящего трафика с помощью FWP_DIRECTION_OUTBOUND)
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6

Датаграмма относится к необработанному сокету, если оба из следующих значений верны:

На следующих сетевых уровнях, если датаграмма принадлежит необработанному сокету, необходимо скопировать элементы headerIncludeHeader и headerIncludeHeaderLengthструктуры FWPS_INCOMING_METADATA_VALUES0 в соответствующий элемент структуры FWPS_TRANSPORT_SEND_PARAMS1 , на который указывает параметр sendArgs :

  • FWPS_LAYER_DATAGRAM_DATA_V4 (при указании направления исходящего трафика с помощью FWP_DIRECTION_OUTBOUND)
  • FWPS_LAYER_DATAGRAM_DATA_V6 (при указании направления исходящего трафика с помощью FWP_DIRECTION_OUTBOUND)

Требования

   
Минимальная версия клиента Доступно начиная с Windows 7.
Целевая платформа Универсальное
Заголовок fwpsk.h (include Fwpsk.h)
Библиотека Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

См. также раздел

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_TRANSPORT_SEND_PARAMS1

FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsInjectTransportSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDeect0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn