Функция FwpsInjectTransportReceiveAsync0 (fwpsk.h)
Функция FwpsInjectTransportReceiveAsync0 внедряет данные пакетов из слоев ошибок транспорта, данных датаграммы или ICMP в путь получения данных.
Синтаксис
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 завершенной структуры NET_BUFFER_LIST указывает причину сбоя. |
|
Сетевой стек TCP/IP не готов принять внедрение данных пакетов. |
|
Маркер внедрения закрывается. |
|
Произошла ошибка. |
Комментарии
Драйвер выноски вызывает функцию 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_INCOMING_METADATA_VALUES0 FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0 FwpsGetPacketListSecurityInformation0FwpsInjectionHandleDeкистрация0
FwpsQueryPacketInjectionState0