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