FwpsInjectTransportReceiveAsync0 函式 (fwpsk.h)
FwpsInjectTransportReceiveAsync0 函式會將來自傳輸、數據報數據或 ICMP 錯誤層的封包數據插入接收數據路徑。
語法
NTSTATUS FwpsInjectTransportReceiveAsync0(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
PVOID reserved,
[in] UINT32 flags,
[in] ADDRESS_FAMILY addressFamily,
[in] COMPARTMENT_ID compartmentId,
[in] IF_INDEX interfaceIndex,
[in] IF_INDEX subInterfaceIndex,
[in, out] NET_BUFFER_LIST *netBufferList,
[in] FWPS_INJECT_COMPLETE0 completionFn,
[in, optional] HANDLE completionContext
);
參數
[in] injectionHandle
先前由呼叫 所建立的插入句柄 FwpsInjectionHandleCreate0 函式。
[in, optional] injectionContext
插入內容的選擇性句柄。 如果指定,當封包插入狀態FWPS_PACKET_INJECTION_STATE FWPS_PACKET_INJECTED_BY_SELF或FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF時,可以呼叫 FwpsQueryPacketInjectionState0 函式來取得。
reserved
保留的。 圖說文字驅動程式必須將此參數設定為零。
[in] flags
保留的。 圖說文字驅動程式必須將此參數設定為零。
[in] addressFamily
下列其中一個位址系列:
AF_INET
IPv4 位址系列。
AF_INET6
IPv6 位址系列。
[in] compartmentId
將封包數據插入其中的路由區間標識符,指定為 COMPARTMENT_ID 類型。 此標識碼是透過的 compartmentId 成員提供給圖說文字 FWPS_INCOMING_METADATA_VALUES0 傳遞至圖說驅動程式 之 classifyFn 圖說文字函式的結構。 如果 hierarchyId 成員可供圖說文字使用, FWPS_METADATA_FIELD_COMPARTMENT_ID 將會在 currentMetadataValues 成員中設定。 否則,請將此參數設定為 UNSPECIFIED_COMPARTMENT_ID。
[in] interfaceIndex
接收原始封包數據的介面索引。 如果封包要插入原始封包所在的相同介面,圖說文字驅動程序應該使用介面索引的值,當做其中一個傳入數據值傳遞至此參數 的 classifyFn 圖說文字函式。
[in] subInterfaceIndex
收到原始封包數據之子介面的索引。 如果封包要插入原始封包所在的相同子介面,圖說文字驅動程序應該使用當做其中一個傳入數據值傳遞至此參數 之分類Fn 圖說文字函數的子介面值。
[in, out] netBufferList
描述所插入封包數據的 NET_BUFFER_LIST 結構的指標。 圖說文字驅動程式會透過呼叫 FwpsAllocateCloneNetBufferList0 函式或 FwpsAllocateNetBufferAndNetBufferList0 函式,配置用來插入封包數據的NET_BUFFER_LIST結構。 NET_BUFFER_LIST結構必須以IP標頭開頭。
[in] completionFn
圖說文字驅動程式所提供 completionFn 圖說文字函式的指標。 篩選引擎會在 netBufferList 參數所描述的封包數據插入網路堆疊之後呼叫此函式。
[in, optional] completionContext
圖說文字驅動程式提供的指標,傳遞至 completionFn 參數所指向的圖說文字函式。 這個參數是選擇性的,而且可以是 NULL。
傳回值
FwpsInjectTransportReceiveAsync0 函式會傳回下列其中一個 NTSTATUS 代碼。
傳回碼 | Description |
---|---|
|
已成功起始封包數據插入。 篩選引擎會在篩選引擎完成將封包數據插入網路堆疊之後,或後續發生錯誤時呼叫完成函式。 如果發生錯誤,已完成NET_BUFFER_LIST結構的 Status 成員將會指出失敗的原因。 |
|
TCP/IP 網路堆疊尚未準備好接受插入封包數據。 |
|
正在關閉插入句柄。 |
|
發生錯誤。 |
備註
圖說文字驅動程式會呼叫 FwpsInjectTransportReceiveAsync0 函式,將來自傳輸、數據報數據或 ICMP 錯誤層的封包數據插入接收數據路徑。 此函式可以異步執行。 修改封包數據時,圖說文字驅動程式通常會將數據插入網路堆疊。 如需圖說文字驅動程式如何修改封包數據的詳細資訊,請參閱 圖說文字驅動程序作業。
如果圖說文字驅動程式修改了將插入 FwpsInjectTransportReceiveAsync0 的封包,它應該呼叫 FwpsConstructIpHeaderForTransportPacket0 函式,可更正 IP 和高階通訊協定 (TCP、UDP 和 ICMP) 總和檢查碼。 FwpsConstructIpHeaderForTransportPacket0 的 headerIncludeHeaderSize 參數應該與 ipHeaderSize 成員的值相同 FWPS_INCOMING_METADATA_VALUES0傳遞至圖說驅動程式之 classifyFn 圖說文字函式之 inMetaValues 參數的結構。
如果未 STATUS_SUCCESS傳回值,則不會呼叫完成函式。 在此情況下, netBufferList 所指向的 net 緩衝區清單必須由 呼叫 FwpsFreeNetBufferList0 釋放或 FwpsFreeCloneNetBufferList0。
如果原始輸入封包數據在最初由傳輸層處理時受到IPsec原則強制執行,則此函式所插入的複製封包會在重新進入網路堆疊時略過IPsec驗證。 使用 FwpsAllocateNetBufferAndNetBufferList0 函式的本機產生的輸入封包也會略過 IPsec 驗證。
若要允許 IPsec 先處理輸入封包,檢查傳輸層數據的圖說文字在FWPS_FILTER0結構中必須低於通用子圖層的 subLayerWeight 值。 此外,圖說文字驅動程式不得攔截組合的通道模式封包isTunnelMode ( FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0成員 && !isDeTunneled ) 由 傳回 FwpsGetPacketListSecurityInformation0 函式 。 圖說文字驅動程式必須等候封包被清除,然後應該在傳輸層或正向層攔截它。
由於 TCP 通訊協議鎖定語意,TCP 只能在任何傳輸層或對等層插入頻外,因此 FwpsInjectTransportReceiveAsync0 和 FwpsInjectTransportSendAsync0 必須由 DPC 排入佇列並執行。
如果未設定 FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED 元數據旗標,可以從下列其中一個傳輸層呼叫此函式:
FWPS_LAYER_INBOUND_TRANSPORT_V4
FWPS_LAYER_INBOUND_TRANSPORT_V6
使用 FWP_DIRECTION_INBOUND) 指定輸入方向時,FWPS_LAYER_DATAGRAM_DATA_V4 (
使用 FWP_DIRECTION_INBOUND) 指定輸入方向時,FWPS_LAYER_DATAGRAM_DATA_V6 (
FWPS_LAYER_INBOUND_ICMP_ERROR_V4
FWPS_LAYER_INBOUND_ICMP_ERROR_V6
否則,應該從下列應用層強制呼叫此函式, (ALE) 層之後,使用對 FwpsPendOperation0 的呼叫來起始 ALE 作業,並已完成 FwpsCompleteOperation0 的呼叫:
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6
要插入的 net 緩衝區清單必須傳遞至 FwpsCompleteOperation0 函式作為 netBufferList 自變數。
插入的封包可以再次向圖說文字驅動程式表示。 若要防止無限迴圈,驅動程式應該先呼叫 FwpsQueryPacketInjectionState0 函式在繼續呼叫 classifyFn 圖說文字函式之前,驅動程式應該允許將插入狀態 FWPS_PACKET_INJECTION_STATE設定為FWPS_PACKET_INJECTED_BY_SELF或FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF的封包通過未變更。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows Vista 開始提供。 |
目標平台 | Universal |
標頭 | fwpsk.h (包含 Fwpsk.h) |
程式庫 | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |