WFP过滤器:通过FwpsInjectNetworkSendAsync发送时丢弃原始TCP数据包

时间:2014-05-04 19:30:26

标签: networking tcp driver wfp

我在FWPM_LAYER_OUTBOUND_IPPACKET_V4注册了一个内核WFP过滤器,在那里我将每个IPv4 NET_BUFFER_LIST复制到缓冲区并从工作线程中重新注入它。我正在使用FWPM_SUBLAYER_UNIVERSAL作为子图层。基本上是:

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

返回0,以及sendComplete回调中的NET_BUFFER_LIST_STATUS()。

这适用于UDP和ICMP(我得到回复),但不适用于TCP数据包。我可以从我正在测试的虚拟机中看到Net在NetMon中出现,但是NetMon看不到数据包到外面(在主机中)。当然没有来自远程主机的回复。

我尝试更新IP校验和(我在classifyFn中得到0)并且它不会改变任何东西。当我的classifyFn收到它时,TCP校验和已经正确(就NetMon而言)。我查看了原始的nbl,我的平面缓冲区和WinDBG中新创建的nbl,它们都包含IP数据包(从0x45开始等)。

我是否必须为过滤器创建新的子图层?是否因为我从与系统进程关联的工作线程调用sendAsync而丢弃数据包?

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:显然在重新注入数据包之前更新了所有校验和(包括tcp / udp)。