Функция FwpsInjectTransportSendAsync0 (fwpsk.h)
Функция FwpsInjectTransportSendAsync0 внедряет данные пакетов из слоев ошибок транспорта, данных датаграмм или ICMP в путь отправки данных.
Синтаксис
NTSTATUS FwpsInjectTransportSendAsync0(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT64 endpointHandle,
[in] UINT32 flags,
[in, optional] FWPS_TRANSPORT_SEND_PARAMS0 *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_PARAMS0 структура, указывающая свойства текущего исходящего пакета. Может иметь значение 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
Указатель на функцию выноски completionFn , предоставляемую драйвером выноски. Модуль фильтрации вызывает эту функцию после того, как данные пакета, описанные в параметре netBufferList , были внедрены в сетевой стек.
[in, optional] completionContext
Указатель на предоставленный драйвером выноски контекст, который передается в функцию выноски, на которую указывает параметр completionFn . Этот параметр является необязательным и может иметь значение NULL.
Возвращаемое значение
Функция FwpsInjectNetworkSendAsync0 возвращает один из следующих кодов NTSTATUS.
Код возврата | Описание |
---|---|
|
Внедрение данных пакета было успешно инициировано. Модуль фильтрации вызовет функцию завершения после завершения модуля фильтрации, вставки данных пакета в сетевой стек или при последующей ошибке. В случае ошибки элемент Status завершенной структуры NET_BUFFER_LIST указывает причину сбоя. |
|
Сетевой стек TCP/IP не готов принимать внедрение данных пакетов. |
|
Маркер внедрения закрывается. |
|
Произошла ошибка. |
Комментарии
Драйвер выноски вызывает функцию FwpsInjectNetworkSendAsync0 для внедрения данных пакетов из уровня транспортных данных, данных датаграмм или ошибок ICMP в путь к данным отправки. На этих уровнях ip-заголовок может быть еще не сформирован, а при активной политике IPsec данные пакетов не шифруются и не подписываются. Поэтому эту функцию идеально использовать для проверки пакетов в среде с поддержкой IPsec.
Эта функция может выполняться асинхронно.
Если возвращаемое значение не STATUS_SUCCESS, функция завершения вызываться не будет. В этом случае список чистого буфера, на который указывает netBufferList , должен быть освобожден вызовом FwpsFreeNetBufferList0 или FwpsFreeCloneNetBufferList0.
Драйверы выносок обычно внедряют данные в сетевой стек при изменении данных пакетов. Дополнительные сведения о том, как драйвер выноски может изменять данные пакетов, см. в разделе Операции с драйвером выноски.
Из-за семантики блокировки протокола TCP tcp можно внедрить только вне диапазона на любом транспортном уровне или эквивалентном уровне, поэтому FwpsInjectTransportReceiveAsync0 и FwpsInjectTransportSendAsync0 должны быть поставлены в очередь и запускаться DPC.
Внедренный пакет можно снова указать драйверу выноски. Чтобы предотвратить бесконечный цикл, драйвер должен сначала вызвать функцию FwpsQueryPacketInjectionState0 перед вызовом функции выноски classifyFn и разрешить пакеты с состоянием внедрения FWPS_PACKET_INJECTION_STATE иметь значение FWPS_PACKET_INJECTED_BY_SELF или FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
Параметр endpointHandle , а также элементы, объявленные в FWPS_TRANSPORT_SEND_PARAMS0 структуры, на которую указывает параметр 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
Датаграмма принадлежит необработанному сокету, если выполняются оба следующих условия:
- Для элемента currentMetadataValues структуры FWPS_INCOMING_METADATA_VALUES0 установлен флаг FWPS_METADATA_FIELD_IP_HEADER_SIZE .
- Элемент ipHeaderSize структуры FWPS_INCOMING_METADATA_VALUES0 больше нуля.
На следующих сетевых уровнях, если датаграмма принадлежит необработанному сокету, список чистого буфера, на который указывает netBufferList , должен начинаться с ip-заголовка (который должен быть добавлен в список чистого буфера):
- FWPS_LAYER_DATAGRAM_DATA_V4 (если направление исходящего трафика указано с помощью FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_DATAGRAM_DATA_V6 (если направление исходящего трафика указано с помощью FWP_DIRECTION_OUTBOUND)
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно начиная с Windows Vista. |
Целевая платформа | Универсальное |
Верхняя часть | fwpsk.h (включая Fwpsk.h) |
Библиотека | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |
См. также раздел
FWPS_INCOMING_METADATA_VALUES0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0FwpsInjectionHandleDeкистрация0
FwpsQueryPacketInjectionState0