2014-05-04 57 views
0

我在FWPM_LAYER_OUTBOUND_IPPACKET_V4註冊了一個內核WFP過濾器,其中我將每個IPv4 NET_BUFFER_LIST複製到緩衝區並從工作線程未修改地重新注入它。我使用FWPM_SUBLAYER_UNIVERSAL作爲子圖層。基本上:WFP過濾器:通過FwpsInjectNetworkSendAsync發送時丟棄原始TCP數據包

mdl = IoAllocateMdl(buffer, ...) 
MmBuildMdlForNonPagedPool(mdl); 
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl) 
FwpsInjectNetworkSendAsync0(..., nbl, ...) 

它返回0以及sendComplete回調中的NET_BUFFER_LIST_STATUS()。

這適用於UDP和ICMP(我收到回覆),但不適用於TCP數據包。我可以從正在測試的虛擬機看到NetMon出現SYN,但是NetMon沒有看到數據包在外面(在主機中)。當然沒有來自遠程主機的回覆。

我試着更新IP校驗和(我在classifyFn中得到0)並且它不會改變任何東西。當我的classifyFn收到它時,TCP校驗和已經是正確的了(只要NetMon可以知道)。我查看了原始的nbl,我的平坦緩衝區和WinDBG中新創建的nbl,它們都包含IP數據包(從0x45開始,等等)。

我是否必須爲過濾器創建一個新的子圖層?丟包是因爲我從與系統進程關聯的工作線程調用sendAsync?

回答

0

回答我自己的問題:在重新輸入數據包之前顯然更新所有校驗和(包括tcp/udp)可以解決問題。