FwpsInjectTransportSendAsync1 函式 (fwpsk.h)
FwpsInjectTransportSendAsync1 函式會將來自傳輸、數據報數據或 ICMP 錯誤層的封包數據插入傳送數據路徑。 此函式與舊版不同 (FwpsInjectTransportSendAsync0) ,因為它會採用更新的參數結構作為自變數。
語法
NTSTATUS FwpsInjectTransportSendAsync1(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT64 endpointHandle,
[in] UINT32 flags,
[in, optional] FWPS_TRANSPORT_SEND_PARAMS1 *sendArgs,
[in] ADDRESS_FAMILY addressFamily,
[in] COMPARTMENT_ID compartmentId,
[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 函式來取得它。
[in] endpointHandle
句柄,表示要插入封包之傳送數據路徑中的堆疊傳輸端點。 此端點句柄會透過 的 transportEndpointHandle 成員提供給圖說文字 FWPS_INCOMING_METADATA_VALUES0 傳遞至圖說驅動程序 分類Fn 圖說文字函式的結構。 圖說文字驅動程式應該使用提供的句柄,儘快將複製的封包插入數據路徑,再關閉與堆棧端點相關聯的套接字,且句柄不再有效。
[in] flags
此參數已保留備用。 圖說文字驅動程式必須將此參數設定為零。
[in, optional] sendArgs
的指標 FWPS_TRANSPORT_SEND_PARAMS1 結構,指定目前輸出封包的屬性。 只有當要插入的 net 緩衝區清單包含 IP 標頭 (時,這個參數才可為 NULL ,例如,如果封包是透過原始套接字傳送) 。
[in] addressFamily
下列其中一個位址系列:
AF_INET
IPv4 位址系列。
AF_INET6
IPv6 位址系列。
[in] compartmentId
將封包數據插入的路由區間標識符,指定為 COMPARTMENT_ID 類型。 此標識子會透過 的 compartmentId 成員提供給圖說文字 FWPS_INCOMING_METADATA_VALUES0 傳遞至圖說驅動程序 分類Fn 圖說文字函式的結構。 如果 compartmentId 成員可供圖說文字使用,FWPS_METADATA_FIELD_COMPARTMENT_ID將會在 currentMetadataValues 成員中設定。 否則,請將此參數設定為 UNSPECIFIED_COMPARTMENT_ID。
[in, out] netBufferList
描述所插入封包數據的 NET_BUFFER_LIST 結構的指標。 圖說文字驅動程式會配置 NET_BUFFER_LIST 結構,以透過呼叫 其中一個 來插入封包數據 FwpsAllocateCloneNetBufferList0 函式或 FwpsAllocateNetBufferAndNetBufferList0 函式。
[in] completionFn
圖說文字驅動程式所提供 之 completionFn 圖說文字函式的指標。 篩選引擎會在 netBufferList 參數所描述的封包數據插入網路堆疊之後呼叫此函式。
[in, optional] completionContext
所提供圖說文字驅動程序內容的指標,傳遞至 completionFn 參數所指向的圖說文字函式。 此參數是選擇性的,可以是 NULL。
傳回值
FwpsInjectTransportSendAsync1 函式會傳回下列其中一個 NTSTATUS 代碼:
傳回碼 | Description |
---|---|
|
封包數據插入已成功起始。 篩選引擎會在篩選引擎完成將封包數據插入網路堆疊之後,或後續發生錯誤時呼叫完成函式。 如果發生錯誤,已完成NET_BUFFER_LIST結構的 Status 成員將會指出失敗的原因。 |
|
TCP/IP 網路堆疊尚未準備好接受封包數據的插入。 |
|
插入句柄正在關閉。 |
|
發生錯誤。 |
備註
圖說文字驅動程式會呼叫 FwpsInjectTransportSendAsync1 函式,將來自傳輸、數據報數據或 ICMP 錯誤層的封包數據插入傳送數據路徑。 在這些層中,IP 標頭可能尚未形成,而且當 IPsec 原則作用中時,封包數據不會加密或簽署。 因此,此函式非常適合用於啟用 IPsec 的環境中的封包檢查。
此函式可以異步執行。
如果傳回值未 STATUS_SUCCESS,則不會呼叫完成函式。 在此情況下, netBufferList 所指向的 net 緩衝區清單必須由 FwpsFreeNetBufferList0 或 FwpsFreeCloneNetBufferList0 的呼叫釋放。
圖說文字驅動程式通常會在修改封包數據時將數據插入網路堆疊。 如需圖說文字驅動程式如何修改封包數據的詳細資訊,請參閱 圖說文字驅動程序作業。
插入的封包可以再次向圖說驅動程式指出。 若要防止無限迴圈,驅動程式應該先呼叫 FwpsQueryPacketInjectionState0 函式,再呼叫 classifyFn 圖說文字函式,並允許將插入狀態 FWPS_PACKET_INJECTION_STATE 設定為 FWPS_PACKET_INJECTED_BY_SELF 或 FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF的封包。
在中宣告的 endpointHandle 參數和成員
sendArgs 參數所指向的FWPS_TRANSPORT_SEND_PARAMS1結構會提供給下列網路層的圖說文字:
- FWPS_LAYER_OUTBOUND_TRANSPORT_V4
- FWPS_LAYER_OUTBOUND_TRANSPORT_V6
- 使用 FWP_DIRECTION_OUTBOUND) 指定輸出方向時FWPS_LAYER_DATAGRAM_DATA_V4 (
- 使用 FWP_DIRECTION_OUTBOUND) 指定輸出方向時FWPS_LAYER_DATAGRAM_DATA_V6 (
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6
如果下列兩者都成立,數據報就會屬於原始套接字:
- FWPS_INCOMING_METADATA_VALUES0 結構的 currentMetadataValues 成員已設定FWPS_METADATA_FIELD_IP_HEADER_SIZE旗標。
- FWPS_INCOMING_METADATA_VALUES0 結構的ipHeaderSize成員大於零。
在下列網路層中,如果數據報屬於原始套接字,您必須將 FWPS_INCOMING_METADATA_VALUES0 結構的headerIncludeHeader 和 headerIncludeHeaderLength 成員複製到 sendArgs 參數指向之FWPS_TRANSPORT_SEND_PARAMS1結構的對應成員:
- 使用 FWP_DIRECTION_OUTBOUND) 指定輸出方向時FWPS_LAYER_DATAGRAM_DATA_V4 (
- 使用 FWP_DIRECTION_OUTBOUND) 指定輸出方向時FWPS_LAYER_DATAGRAM_DATA_V6 (
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | 從 Windows 7 開始提供。 |
目標平台 | Universal |
標頭 | fwpsk.h (包含 Fwpsk.h) |
程式庫 | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |