FwpsConstructIpHeaderForTransportPacket0 函式 (fwpsk.h)
FwpsConstructIpHeaderForTransportPacket0 函式是由圖說文字呼叫,以建構新的 IP 標頭,或重建一個網路緩衝區預先存在的 IP 封包標頭。
語法
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_INET 或 AF_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 程式代碼。
傳回碼 | 描述 |
---|---|
|
已成功建構新的IP標頭。 |
|
發生錯誤。 |
言論
從在 WFP 輸出傳輸層複製的 net 緩衝區清單 (FWPS_LAYER_OUTBOUND_TRANSPORT_Xxx),FwpsConstructIpHeaderForTransportPacket0 為每個屬於 net 緩衝區列表鏈結的 net 緩衝區建構新的標頭。 此函式也可以用來重建封包的預先存在IP標頭,在此情況下,net緩衝區清單必須只包含一個 net 緩衝區。
此函式在尚未建立IP標頭時很有用,但來源IP位址或來源埠必須從傳輸層修改。 雖然通常可以等候執行這類修改,直到封包到達網路層為止,但這無法在IP封包經過加密或數字簽署的IPsec環境中完成,才能到達網路層。
來源IP位址可以修改為另一個本機定義的IP位址,或本機電腦上不存在的另一個位址。 如此修改的封包就可以傳送或插入接收或轉送數據路徑。
如果指定了非零 endpointHandle 參數,則會話狀態(套接字選項),如果有的話,將會用來建構每個新的IP標頭。 同樣地,如果使用 controlData 和 controlDataLength 參數來指定其他套接字選項,則這些選項將用來建構每個新的 IP 標頭。
如果輸入 net 緩衝區清單是從輸入 WFP 傳輸層複製的,或因為原始傳送作業而建立的,則 net 緩衝區已經包含 IP 標頭。 在此情況下,呼叫此函式時,將會在新IP標頭中保留IPv4選項,但將會移除 AH/ESP 標頭和 IPv6 擴充功能標頭。 由於 TCP/IP 堆疊會在 IPsec 處理之後保留 AH/ESP 標頭,因此已由 WFP 指示並透過圖說文字複製的封包無法輕易插入接收數據路徑。 因此,此函式適用於使用 FwpsInjectTransportReceiveAsync0 函式重建要插入接收數據路徑的 IPsec 處理封包。
針對標頭包含會話;例如,若要從輸出傳輸層篩選在原始套接字上傳送的一般路由封裝 (GRE) 流量 (GRE) 流量,請在呼叫 FwpsConstructIpHeaderForTransportPacket0之前,使用下列程式:
- 呼叫 來複製 net buffer 清單 FwpsAllocateCloneNetBufferList0 函式。
- 如果 headerIncludeHeaderLength FWPS_INCOMING_METADATA_VALUES0 結構的成員,分類Fn 函式 inMetaValues 參數大於零,請依該數量撤退複製的淨緩衝區清單:例如,呼叫 NdisRetreatNetBufferListDataStart。
- 將 headerIncludeHeader 所指向的緩衝區, FWPS_INCOMING_METADATA_VALUES0 成員複製到複製之 net 緩衝區清單的新撤退區域。 緩衝區的大小必須等於 headerIncludeHeaderLength的值。
- 呼叫 FwpsConstructIpHeaderForTransportPacket0,其具有指向複製的 net 緩衝區清單的 NetBufferList 參數,並將 headerIncludeHeaderSize 參數設定為 headerIncludeHeaderLength的值。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 從 Windows Server 2008 開始提供。 |
目標平臺 | 普遍 |
標頭 | fwpsk.h (包括 Fwpsk.h) |
連結庫 | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |