共用方式為


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

如果 NetBufferList 所指向NET_BUFFER_LIST結構 已經包含IP標頭,則表示現有IP標頭的總大小,以位元組為單位(如果有的話)。 如果 netBufferList 不包含IP標頭,headerIncludeHeaderSize 為零。 否則,此參數的值等於 ipHeaderSize 成員傳遞至圖說文字驅動程式 分類Fn 圖說函式的 FWPS_INCOMING_METADATA_VALUES0 結構。 請注意,呼叫此函式時,將會移除現有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

指定要建構之新IP標頭的IPPROTO通訊協議類型。 如需 IPPROTO 列舉的詳細資訊,請參閱 AF_INETAF_INET6

[in, optional] endpointHandle

選擇性句柄,表示要插入封包的傳送數據路徑中的堆疊傳輸端點。 此端點句柄是透過 transportEndpointHandle 成員提供給圖說文字傳遞至圖說文字驅動程式 分類Fn 圖說函式的 FWPS_INCOMING_METADATA_VALUES0 結構。

[in, optional] controlData

緩衝區的選擇性指標,其中包含 WSASendMsg 函式所指定的套接字控件數據,如Microsoft Windows SDK 檔所述。 如需 WSACMSGHDR 類型的相關信息,請參閱 CMSGHDR

如果有的話,套接字控件數據會提供給具有 controlData 成員的圖說文字傳遞至圖說文字驅動程式 分類Fn 圖說函式的 FWPS_INCOMING_METADATA_VALUES0 結構。

如果套接字控件數據未 NULL,則必須在圖說驅動程式的 classifyFn 函式實作中深層複製,而且 controlData 緩衝區必須保持有效,直到呼叫插入完成函式為止。

[in] controlDataLength

controlData 參數的長度,以位元組為單位。

[in] flags

指定 NBL 是否要用於傳送或接收路徑的旗標。 旗標 參數可以具有下列值:

價值 意義
FWPS_CONSTRUCT_IPHEADER_FOR_SEND 設定時,此旗標會指定 NBL 是用於傳送路徑。
FWPS_CONSTRUCT_IPHEADER_FOR_RECEIVE 設定時,此旗標會指定 NBL 是用於接收路徑。

對於支援 USO 或 URO 的圖說文字驅動程式,必須將此參數設定為下列其中一個值。 其他註標驅動程式可以將此參數設定為 。 Windows Server 2022 23H2 和更新版本僅支持這些旗標。 在舊版 Windows 上,圖說驅動程式必須一律將此參數設定為

reserved

保留。 圖說文字驅動程式必須將此參數設定為 NULL

[in, optional] interfaceIndex

接收原始封包數據的介面索引。 圖說驅動程式應該使用介面索引的值,做為其中一個傳入數據值傳遞至其 分類Fn 注標函式。 這個參數是選擇性的,而且可以是零。

[in, optional] subInterfaceIndex

接收原始封包數據之子介面的索引。 如果封包要插入原始封包的相同子介面,則圖說驅動程式應該使用作為其中一個傳入數據值傳遞至其 分類Fn 註標函式的子介面索引值。 這個參數是選擇性的,而且可以是零。

傳回值

FwpsConstructIpHeaderForTransportPacket0 函式會傳回下列其中一個 NTSTATUS 程式代碼。

傳回碼 描述
STATUS_SUCCESS
已成功建構新的IP標頭。
其他狀態代碼
發生錯誤。

言論

從在 WFP 輸出傳輸層複製的 net 緩衝區清單 (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx),FwpsConstructIpHeaderForTransportPacket0 為每個屬於 net 緩衝區列表鏈結的 net 緩衝區建構新的標頭。 此函式也可以用來重建封包的預先存在IP標頭,在此情況下,net緩衝區清單必須只包含一個 net 緩衝區。

此函式在尚未建立IP標頭時很有用,但來源IP位址或來源埠必須從傳輸層修改。 雖然通常可以等候執行這類修改,直到封包到達網路層為止,但這無法在IP封包經過加密或數字簽署的IPsec環境中完成,才能到達網路層。

來源IP位址可以修改為另一個本機定義的IP位址,或本機電腦上不存在的另一個位址。 如此修改的封包就可以傳送或插入接收或轉送數據路徑。

如果指定了非零 endpointHandle 參數,則會話狀態(套接字選項),如果有的話,將會用來建構每個新的IP標頭。 同樣地,如果使用 controlDatacontrolDataLength 參數來指定其他套接字選項,則這些選項將用來建構每個新的 IP 標頭。

如果輸入 net 緩衝區清單是從輸入 WFP 傳輸層複製的,或因為原始傳送作業而建立的,則 net 緩衝區已經包含 IP 標頭。 在此情況下,呼叫此函式時,將會在新IP標頭中保留IPv4選項,但將會移除 AH/ESP 標頭和 IPv6 擴充功能標頭。 由於 TCP/IP 堆疊會在 IPsec 處理之後保留 AH/ESP 標頭,因此已由 WFP 指示並透過圖說文字複製的封包無法輕易插入接收數據路徑。 因此,此函式適用於使用 FwpsInjectTransportReceiveAsync0 函式重建要插入接收數據路徑的 IPsec 處理封包。

針對標頭包含會話;例如,若要從輸出傳輸層篩選在原始套接字上傳送的一般路由封裝 (GRE) 流量 (GRE) 流量,請在呼叫 FwpsConstructIpHeaderForTransportPacket0之前,使用下列程式:

  1. 呼叫 來複製 net buffer 清單 FwpsAllocateCloneNetBufferList0 函式。
  2. 如果 headerIncludeHeaderLength FWPS_INCOMING_METADATA_VALUES0 結構的成員,分類Fn 函式 inMetaValues 參數大於零,請依該數量撤退複製的淨緩衝區清單:例如,呼叫 NdisRetreatNetBufferListDataStart
  3. headerIncludeHeader 所指向的緩衝區, FWPS_INCOMING_METADATA_VALUES0 成員複製到複製之 net 緩衝區清單的新撤退區域。 緩衝區的大小必須等於 headerIncludeHeaderLength的值。
  4. 呼叫 FwpsConstructIpHeaderForTransportPacket0,其具有指向複製的 net 緩衝區清單的 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

分類Fn