共用方式為


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標頭的總大小,以位元組為單位,如果現有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

指定要建構之新IP標頭的IPPROTO通訊協議類型。 如需 IPPROTO 列舉的詳細資訊,請參閱 AF_INETAF_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,則必須在 callout 驅動程式的 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

收到原始封包數據之子介面的索引。 如果封包要插入原始封包所在的相同子介面,圖說文字驅動程序應該使用當做其中一個傳入數據值傳遞至此參數 之分類Fn 圖說文字函數的子介面值。 這個參數是選擇性的,而且可以是零。

傳回值

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

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

備註

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

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

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

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

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

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

  1. 呼叫 來複製 net 緩衝區清單 FwpsAllocateCloneNetBufferList0 函式。
  2. 如果 classifyFn 函式 inMetaValues 參數所指向之FWPS_INCOMING_METADATA_VALUES0結構的 headerIncludeHeaderLength 成員大於零,請依該數量來壓縮複製的 net 緩衝區清單;例如,呼叫 NdisRetreatNetBufferListDataStart
  3. headerIncludeHeader 成員指向的緩衝區複製到所複製之 net 緩衝區清單的新建區域FWPS_INCOMING_METADATA_VALUES0。 緩衝區的大小必須等於 headerIncludeHeaderLength的值。
  4. 呼叫 FwpsConstructIpHeaderForTransportPacket0,其 NetBufferList 參數指向複製的 net 緩衝區清單,並將 headerIncludeHeaderSize 參數設定為 headerIncludeHeaderLength 的值。
FwpsConstructIpHeaderForTransportPacket0 會停用大型傳送卸除 (LSO) 和總和檢查碼卸除支援,以支持產生的 net buffer 列表。 完整總和檢查碼會針對 TCP、UDP 和 ICMP) (高階通訊協議計算。 重新建構IP標頭時,會重新計算IP總和檢查碼。

規格需求

需求
最低支援的用戶端 從 Windows Server 2008 開始提供。
目標平台 Universal
標頭 fwpsk.h (包含 Fwpsk.h)
程式庫 Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

另請參閱

AF_INET

AF_INET6

CMSGHDR

FWPS_INCOMING_METADATA_VALUES0 FwpsInjectTransportReceiveAsync0

NET_BUFFER_LIST

classifyFn