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

Функция FwpsInjectTransportReceiveAsync0 внедряет данные пакетов из слоев ошибок транспорта, данных датаграммы или ICMP в путь получения данных.

ПримечаниеFwpsInjectTransportReceiveAsync0 — это определенная версия FwpsInjectTransportReceiveAsync. Дополнительные сведения см. в разделах Имена Version-Independent и Выбор конкретных версий Windows .
 

Синтаксис

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

Параметры

[in] injectionHandle

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

[in, optional] injectionContext

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

reserved

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

[in] flags

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

[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] interfaceIndex

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

[in] subInterfaceIndex

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

[in, out] netBufferList

Указатель на структуру NET_BUFFER_LIST , описывающую внедряемые данные пакетов. Драйвер выноски выделяет структуру NET_BUFFER_LIST для внедрения пакетных данных путем вызова функции FwpsAllocateCloneNetBufferList0 или FwpsAllocateNetBufferAndNetBufferList0 . Структура NET_BUFFER_LIST должна начинаться с ip-заголовка.

[in] completionFn

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

[in, optional] completionContext

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

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

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

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

Комментарии

Драйвер выноски вызывает функцию FwpsInjectTransportReceiveAsync0 , чтобы внедрить данные пакетов из слоев ошибок транспорта, данных датаграмм или ICMP в путь получения данных. Эта функция может выполняться асинхронно. Драйверы выносок обычно внедряют данные в сетевой стек при изменении данных пакетов. Дополнительные сведения о том, как драйвер выноски может изменять пакетные данные, см. в разделе Операции с драйвером выносок.

Если драйвер выноски изменил пакет, который он будет внедрять с помощью FwpsInjectTransportReceiveAsync0, он должен вызватьФункция FwpsConstructIpHeaderForTransportPacket0 для исправления контрольных сумм ПРОТОКОЛА IP и протокола верхнего уровня (TCP, UDP и ICMP). Параметр headerIncludeHeaderSizeобъекта FwpsConstructIpHeaderForTransportPacket0 должен иметь то же значение, что и элемент ipHeaderSize FWPS_INCOMING_METADATA_VALUES0 структуры, передаваемой параметру inMetaValues функции выноски classifyFn драйвера выноски.

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

Если исходные входящие данные пакетов подвергались принудительному применению политики IPsec при первоначальной обработке на транспортном уровне, клонированные пакеты, внедренные этой функцией, будут обходить проверку IPsec при повторном вводе сетевого стека. Локально созданные входящие пакеты, использующие функцию FwpsAllocateNetBufferAndNetBufferList0 , также обходят проверку IPsec.

Чтобы IPsec сначала обрабатывал входящие пакеты, выноска, проверяющая данные транспортного уровня, должна иметь меньшее значение subLayerWeight в структуре FWPS_FILTER0 , чем универсальный подслой. Кроме того, драйвер выноски не должен перехватывать пакеты в режиме туннеля, для которых используется сочетание элементы FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 ( isTunnelMode && ! isDeTunneled ) возвращаетсяФункция FwpsGetPacketListSecurityInformation0. Драйвер выноски должен ждать, пока пакет не будет отключлен, а затем перехватывать его на транспортном уровне или на переднем уровне.

Из-за семантики блокировки протокола TCP протокол tcp может быть внедрен только вне диапазона на любом транспортном уровне или эквивалентном уровне, поэтому FwpsInjectTransportReceiveAsync0 и FwpsInjectTransportSendAsync0 должны быть поставлены в очередь и запускаться DPC.

Эту функцию можно вызвать из одного из следующих уровней транспорта, если флаг метаданных FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED не задан:

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

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

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

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

В противном случае эту функцию следует вызывать из следующих уровней ALE после запуска операции ALE с вызовом FwpsPendOperation0 и вызова FwpsCompleteOperation0:

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

Внедренный список чистого буфера должен быть передан в функцию FwpsCompleteOperation0 в качестве аргумента netBufferList .

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

Требования

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

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

FWPS_FILTER0

FWPS_FILTER_CONDITION0

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCompleteOperation0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsGetPacketListSecurityInformation0

FwpsInjectNetworkSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDeкистрация0

FwpsPendOperation0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

classifyFn

completionFn