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

Функция FwpsConstructIpHeaderForTransportPacket0 вызывается выноской для создания нового ip-заголовка или для перестроения уже существовающего заголовка IP-пакета только для одного чистого буфера.

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

Синтаксис

NTSTATUS FwpsConstructIpHeaderForTransportPacket0(
  [in, out]      NET_BUFFER_LIST  *netBufferList,
                 ULONG            headerIncludeHeaderLength,
  [in]           ADDRESS_FAMILY   addressFamily,
  [in]           const UCHAR      *sourceAddress,
  [in]           const UCHAR      *remoteAddress,
  [in]           IPPROTO          nextProtocol,
  [in, optional] UINT64           endpointHandle,
  [in, optional] const WSACMSGHDR *controlData,
  [in]           ULONG            controlDataLength,
  [in]           UINT32           flags,
                 PVOID            reserved,
  [in, optional] IF_INDEX         interfaceIndex,
  [in, optional] IF_INDEX         subInterfaceIndex
);

Параметры

[in, out] netBufferList

Указатель на структуру NET_BUFFER_LIST , описывающую клонированные данные пакетов транспортного уровня, для которых необходимо создать или перестроить новый IP-заголовок. Чтобы создать новый заголовок IP, найдите смещение клонированного NET_BUFFER_LIST структуры в начале заголовка транспорта. Чтобы перестроить уже существующий заголовок IP-пакета, найдите смещение в начале ip-заголовка.

headerIncludeHeaderLength

Если структура NET_BUFFER_LIST, на которую указывает NetBufferList , уже содержит заголовок IP, указывает общий размер существующего IP-заголовка (если он существует). Если NetBufferList не содержит заголовок IP, headerIncludeHeaderSize равно нулю. В противном случае значение этого параметра равно члену ipHeaderSize FWPS_INCOMING_METADATA_VALUES0 структуры, передаваемой функции выноски classifyFn драйвера выноски. Обратите внимание, что заголовки расширений для существующего заголовка IPv6 будут удалены при вызове этой функции, хотя параметры IPv4 будут сохранены. Дополнительные сведения см. в подразделе "Примечания".

[in] addressFamily

Одно из следующих семейств адресов:

AF_INET

Семейство адресов IPv4.

AF_INET6

Семейство адресов IPv6.

[in] sourceAddress

Указатель на исходный IP-адрес, который будет частью созданного IP-заголовка. Для IPv4 адрес составляет 4 байта. Для IPv6 адрес равен 16 байтам. Байты исходного адреса всегда находятся в порядке байтов сети.

[in] remoteAddress

Указатель на буфер, указывающий удаленный IP-адрес, который будет частью созданного IP-заголовка.

Буфер может содержать IPv4-адрес (4 байта) или IPv6-адрес (16 байт), и адрес должен быть указан в порядке байтов сети. Версия IP-адреса должна соответствовать параметру addressFamily .

[in] nextProtocol

Указывает тип протокола IPPROTO нового ip-заголовка, который необходимо создать. Дополнительные сведения о перечислении IPPROTO см. в разделе AF_INET или AF_INET6.

[in, optional] endpointHandle

Необязательный дескриптор, указывающий конечную точку транспорта стека в пути отправки данных, в который необходимо внедрить пакет. Этот дескриптор конечной точки предоставляется в выноску через член transportEndpointHandle FWPS_INCOMING_METADATA_VALUES0 структуры, передаваемой функции выноски classifyFn драйвера выноски.

[in, optional] controlData

Необязательный указатель на буфер, содержащий данные управления сокетом, заданные функцией WSASendMsg, которая описана в документации по Microsoft Windows SDK. Сведения о типе WSACMSGHDR см. в разделе CMSGHDR.

Если они есть, данные элемента управления сокета предоставляются в выноску с элементом controlData FWPS_INCOMING_METADATA_VALUES0 структуры, передаваемой функции выноски classifyFn драйвера выноски.

Если данные управления сокетом не равно NULL, они должны быть глубоко скопированы в реализации драйвера выноски функции classifyFn , а буфер controlData должен поддерживаться до вызова функции завершения внедрения.

[in] controlDataLength

Длина параметра controlData в байтах.

[in] flags

Флаги, указывающие, предназначен ли NBL для пути отправки или получения. Параметр flags может иметь следующие значения:

Значение Значение
FWPS_CONSTRUCT_IPHEADER_FOR_SEND Если этот флаг задан, он указывает, что NBL предназначен для пути отправки.
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE Если этот флаг задан, он указывает, что NBL предназначен для пути получения.

Для драйверов выносок, поддерживающих USO или URO, необходимо задать для этого параметра одно из этих значений. Другие драйверы выносок могут задать для этого параметра нулевое значение. Эти флаги поддерживаются только в Windows Server 2022 23H2 и более поздних версиях. В предыдущих выпусках Windows драйверы выносок всегда должны задавать для этого параметра нулевое значение.

reserved

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

[in, optional] interfaceIndex

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

[in, optional] subInterfaceIndex

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

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

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

Код возврата Описание
STATUS_SUCCESS
Новый заголовок IP успешно создан.
Другие коды состояния
Произошла ошибка.

Комментарии

Из списка чистого буфера, клонированного на уровне исходящего транспорта МПП (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx), FwpsConstructIpHeaderForTransportPacket0 создает новый заголовок для каждого чистого буфера, который является частью цепочки списков чистых буферов. Эта функция также может использоваться для перестроения ранее существовающего IP-заголовка пакета. В этом случае список чистых буферов должен содержать только один чистый буфер.

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

Исходный IP-адрес можно изменить, чтобы он был другим локально определенным IP-адресом или другим адресом, который не существует на локальном компьютере. Пакеты, измененные таким образом, могут быть отправлены или внедрены в путь получения или пересылки данных.

Если указан ненулевой параметр endpointHandle , для создания каждого нового IP-заголовка будут использоваться состояния сеанса (параметры сокета), если таковые есть, связанные с сокетом. Аналогичным образом, если дополнительные параметры сокета указаны с параметрами controlData и controlDataLength , эти параметры будут использоваться для создания каждого нового заголовка IP-адреса.

Если список входного чистого буфера был клонирован из входящего транспортного уровня ПППП или был создан в результате необработанной операции отправки, то чистые буферы уже будут содержать заголовок IP. В этом случае при вызове этой функции параметры IPv4 будут сохранены в новом ip-заголовке, но заголовки AH/ESP и заголовки расширения IPv6 будут удалены. Так как стек TCP/IP сохраняет заголовки AH/ESP после обработки IPsec, пакеты, указанные ВПП и клонированные выносками, не могут быть легко внедрены в путь получения данных. Следовательно, эта функция полезна для перестроения пакетов, обработанных IPsec, которые должны быть внедрены в путь получения данных с помощью функции FwpsInjectTransportReceiveAsync0 .

Для сеанса с включением заголовков; Например, чтобы отфильтровать трафик GRE (IP-протокол 47), отправляемый в необработанный сокет из исходящих транспортных слоев, перед вызовом FwpsConstructIpHeaderForTransportPacket0 выполните следующую процедуру:

  1. Клонирование списка чистого буфера путем вызоваФункция FwpsAllocateCloneNetBufferList0.
  2. Если элемент headerIncludeHeaderLength FWPS_INCOMING_METADATA_VALUES0 структуры, на которую указывает параметр inMetaValues функции classifyFn, больше нуля, отступите от клонированного списка чистого буфера на эту величину; например, путем вызова NdisRetreatNetBufferListDataStart.
  3. Скопируйте буфер, на который указывает элемент headerIncludeHeader FWPS_INCOMING_METADATA_VALUES0, в только что отступленную область клонированного списка чистых буферов. Размер буфера должен быть равен значению headerIncludeHeaderLength.
  4. Вызовите FwpsConstructIpHeaderForTransportPacket0 , у которого параметр NetBufferList указывает на список клонированного чистого буфера, а параметру headerIncludeHeaderSize присвоено значение headerIncludeHeaderLength.
FwpsConstructIpHeaderForTransportPacket0 отключает поддержку разгрузки большой отправки (LSO) и разгрузки контрольной суммы для полученного списка чистого буфера. Полные контрольные суммы вычисляются для протоколов верхнего уровня (TCP, UDP и ICMP). Контрольная сумма IP-адресов пересчитывается при восстановлении ip-заголовка.

Требования

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

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

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn