Функция FwpsInjectTransportSendAsync1 (fwpsk.h)
Функция FwpsInjectTransportSendAsync1 внедряет данные пакетов из слоев ошибок транспорта, данных датаграмм или ICMP в путь отправки данных. Эта функция отличается от предыдущей версии (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 завершенной структуры NET_BUFFER_LIST указывает причину сбоя. |
|
Сетевой стек TCP/IP не готов принять внедрение данных пакетов. |
|
Маркер внедрения закрывается. |
|
Произошла ошибка. |
Комментарии
Драйвер выноски вызывает функцию 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
Датаграмма принадлежит необработанному сокету, если выполняются оба следующих условия:
- Элемент currentMetadataValues структуры FWPS_INCOMING_METADATA_VALUES0 имеет флаг FWPS_METADATA_FIELD_IP_HEADER_SIZE .
- Элемент ipHeaderSize структуры FWPS_INCOMING_METADATA_VALUES0 больше нуля.
На следующих уровнях сети, если датаграмма принадлежит необработанному сокету, необходимо скопировать элементы 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 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0FwpsInjectionHandleDeкистрация0
FwpsQueryPacketInjectionState0