封包插入函式

圖說文字驅動程式可以呼叫下列的一個一個的一個,將手寫筆或修改的封包資料插入 TCP/IP 堆疊中。 下表列出可插入資料的適用層以及可能的目的地。

插入函式 適用的圖層 Destination

FwpsInjectForwardAsync0

網路層

轉送資料路徑

FwpsInjectNetworkReceiveAsync0

網路層

接收資料路徑

FwpsInjectNetworkSendAsync0

網路層

傳送資料路徑

FwpsInjectTransportReceiveAsync0

來自傳輸、資料包資料、ICMP 錯誤或 ALE 層的封包資料

接收資料路徑

FwpsInjectTransportSendAsync0

來自傳輸、資料包資料、ICMP 錯誤或 ALE 層的封包資料

傳送資料路徑

FwpsStreamInjectAsync0

TCP 資料區段

資料流程

此外, FwpsQueryPacketInjectionState0 函式可用來檢查封包資料的插入歷程記錄。

如果圖說文字可以提供插入函式所需的所有必要資訊,而且 net 緩衝區清單具有插入函式預期的格式,則會啟用跨層插入。 例如,圖說文字可以在轉寄路徑擷取封包、將其目的地位址修改為本機電腦的目的地位址,並呼叫 FwpsInjectTransportReceiveAsync0 將封包重新導向至本機電腦的 TCP/IP 堆疊。

除了串流 (TCP 資料) 插入之外,插入的傳入封包會從堆疊和一層的 「bottom」 重新輸入,而插入的傳出封包會從堆疊的 「頂端」和「個」層重新輸入。 例如,從傳入資料包資料層插入的 UDP 封包會重新進入堆疊並周遊網路層、傳輸層、ALE 接收或接受層 (選擇性) ,然後回到資料包資料層。 從傳出網路層插入的另一個 UDP 封包會重新進入堆疊,並周遊 ALE (選擇性) 、資料包資料和傳輸層,然後回到網路層。

FwpsInjectTransportReceiveAsync0 會自動略過重新連接封包的 IPsec 處理,因為它先前已通過 IPsec 驗證。

除了修改封包會導致它遺漏原始篩選準則的情況下,否則會重新向圖說文字指示詞插入的封包。 其提供 FwpsQueryPacketInjectionState0 函式,讓圖說文字查詢封包是插入 (還是稍早由圖說文字插入) 。 為了避免無限迴圈,圖說文字應該允許自我插入封包。

圖說文字必須在修改 IP 封包之後調整 IP 或傳輸層總和檢查碼,或兩者。 圖說文字可以將 UDP over IPv4 封包的總和檢查碼設定為 0。 若要與傳輸層總和檢查碼卸載相容,並據以調整完整總和檢查碼與虛擬總和檢查碼計算,圖說文字可以使用下列邏輯:

NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
 ChecksumInfo.Value = 
 (ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
 NetBufferList,TcpIpChecksumNetBufferListInfo);

如果 ChecksumInfo.Transmit.NdisPacketTcpChecksum 為 TRUE,則會卸載 TCP 傳送作業。 如果 ChecksumInfo.Transmit.NdisPacketUdpChecksum 為 TRUE,則會卸載 UDP 傳送作業。

在 Service Pack 1 (SP1) 和 Windows Server 2008 的 Windows Vista 中,如果 inMetaValues-headerIncludeHeaderLength > 大於 0,則傳出封包是包含 IP 標頭的原始傳送重新檢視。 若要執行包含 SP1 和 Windows Server 2008 之 Windows Vista IP 標頭的 RAW 傳送重新檢視,您必須以 inMetaValues-headerIncludeHeaderLength > 中的數量取代複製的封包,並將 inMetaValues-headerIncludeHeader > 複製到新擴充的空間。 然後,使用 FwpsInjectTransportSendAsync0 搭配封包的 net 緩衝區清單,並將FWPS_TRANSPORT_SEND_PARAMS0參數設定為 Null。 For more information about retreat operations for net buffer lists, see Retreat and Advance Operations.

注意 針對原始傳送作業,net 緩衝區清單必須只包含單一 Net 緩衝區。 如果您的 net 緩衝區清單包含一個以上的 net buffer,您必須將 net buffer 清單轉換成一系列的 net buffer 清單,而且數列中的每一個都必須包含單一 net buffer。 如需 net buffer list management 的詳細資訊,請參閱 NET_BUFFER Architecture