Поделиться через


Функции внедрения пакетов

Драйвер выноски может вызывать следующие функции ПППП, чтобы внедрить данные пакетов с модифицируемыми или измененными данными в стек TCP/IP. В следующей таблице перечислены применимые уровни, из которых можно внедрять данные, а также возможные назначения.

Функция внедрения Применимый слой Назначение

FwpsInjectForwardAsync0

сетевой уровень

путь к данным пересылки

FwpsInjectNetworkReceiveAsync0

сетевой уровень

Путь к данным получения

FwpsInjectNetworkSendAsync0

сетевой уровень

путь отправки данных

FwpsInjectTransportReceiveAsync0

данные пакета из транспорта, данные датаграммы, ошибки ICMP или уровней ALE

Путь к данным получения

FwpsInjectTransportSendAsync0

данные пакета из транспорта, данные датаграммы, ошибки ICMP или уровней ALE

путь отправки данных

FwpsStreamInjectAsync0

Сегменты данных TCP

поток данных;

Кроме того, функция FwpsQueryPacketInjectionState0 используется для проверки журнала внедрения данных пакета.

Внедрение поперечного слоя включено, если выноска может предоставить все необходимые сведения, необходимые для функции внедрения, а список чистых буферов имеет формат, ожидаемый функцией внедрения. Например, выноска может записать пакет по пути пересылки, изменить адрес назначения на адрес локального компьютера и вызвать FwpsInjectTransportReceiveAsync0 , чтобы перенаправить пакет в стек TCP/IP локального компьютера.

За исключением потоковой передачи данных (TCP), внедренные входящие пакеты повторно вводятся из "нижней части" стека и уровней МПП, в то время как внедренные исходящие пакеты повторно вводятся из "верхней" части стека и уровней МПП. Например, пакет UDP, внедренный из уровня данных входящей датаграммы, повторно войдет в стек и пройдет по сетевому уровню, транспортному уровню, уровню приема или приема ALE (необязательно) и обратно на уровень данных датаграммы. Другой пакет UDP, внедренный с исходящего сетевого уровня, повторно войдет в стек и пройдет по уровням ALE (необязательно), данных датаграммы и транспорта, а также обратно на сетевой уровень.

FwpsInjectTransportReceiveAsync0 автоматически обходит обработку IPsec для повторного передачи пакета, так как он ранее прошел проверку IPsec.

Пакет, введенный драйвером выноски МПП, будет повторно указан в выноску, за исключением случаев, когда изменение пакета приводит к пропуску исходных условий фильтра. МПП предоставляет функцию FwpsQueryPacketInjectionState0 для выносок, чтобы запрашивать, был ли пакет внедрен (или введен ранее) выноской. Чтобы предотвратить бесконечные циклы, выноски должны разрешать самостоятельно вставляемые пакеты.

Выноски должны изменять контрольную сумму IP-адреса или транспортного уровня после изменения IP-пакета. Выноска может задать для контрольной суммы значение 0 для пакетов UDP по протоколу IPv4. Чтобы обеспечить совместимость с разгрузкой контрольной суммы транспортного уровня и соответствующим образом настроить вычисления полной контрольной суммы по сравнению с псевдо контрольной суммой, выноска может использовать следующую логику:

NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
 ChecksumInfo.Value = 
 (ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
 NetBufferList,TcpIpChecksumNetBufferListInfo);

Если параметр ChecksumInfo.Transmit.NdisPacketTcpChecksum имеет значение TRUE, операция отправки TCP будет разгружена. Если параметр ChecksumInfo.Transmit.NdisPacketUdpChecksum имеет значение TRUE, операция отправки UDP будет разгружена.

В Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008, если inMetaValues-headerIncludeHeaderLength> больше 0, исходящий пакет является необработанным перенаправлением отправки, который включает заголовок IP. Чтобы выполнить повторное заполнение необработанной отправки, включающее заголовок IP для Windows Vista с пакетом обновления 1 (SP1) и Windows Server 2008, необходимо отступить от клонированного пакета на величину в inMetaValues-headerIncludeHeadgth> и скопировать inMetaValues-headerIncludeHeader> на новое расширенное пространство. Затем используйте FwpsInjectTransportSendAsync0 со списком чистых буферов для пакета и оставьте для параметра FWPS_TRANSPORT_SEND_PARAMS0 значение NULL. Дополнительные сведения об операциях отступления для списков чистых буферов см. в разделах Retreat и Advance Operations.

Примечание Для необработанных операций отправки список чистых буферов должен содержать только один чистый буфер. Если список чистых буферов содержит несколько чистых буферов, необходимо преобразовать список чистых буферов в последовательность списков чистых буферов, и каждый из них должен содержать один чистый буфер. Дополнительные сведения об управлении списками чистых буферов см. в разделе Архитектура NET_BUFFER.