Функция 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 будет задан в элементе currentMetadataValues . В противном случае задайте для этого параметра значение UNSPECIFIED_COMPARTMENT_ID.

[in, out] netBufferList

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

[in] completionFn

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

[in, optional] completionContext

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

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

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

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

Комментарии

Драйвер выноски вызывает функцию 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 (включая 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

FwpsInjectionHandleDeкистрация0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn