【发布时间】:2014-05-04 19:30:25
【问题描述】:
我在 FWPM_LAYER_OUTBOUND_IPPACKET_V4 注册了一个内核 WFP 过滤器,在其中我将每个 IPv4 NET_BUFFER_LIST 复制到一个缓冲区,并从工作线程中重新注入它而不进行修改。我使用 FWPM_SUBLAYER_UNIVERSAL 作为子层。基本上:
mdl = IoAllocateMdl(buffer, ...)
MmBuildMdlForNonPagedPool(mdl);
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl)
FwpsInjectNetworkSendAsync0(..., nbl, ...)
从 sendComplete 回调中返回 0 以及 NET_BUFFER_LIST_STATUS()。
这适用于 UDP 和 ICMP(我收到回复),但不适用于 TCP 数据包。我可以从我正在测试的虚拟机中看到 SYN 在 NetMon 中发出,但 NetMon 没有看到外部数据包(在主机中)。当然,远程主机也没有回复。
我尝试更新 IP 校验和(我在分类 Fn 中得到 0)并且它没有改变任何东西。当我的classifyFn 收到TCP 校验和时(据NetMon 所知),TCP 校验和已经正确。我查看了原始的nbl,我的平面缓冲区和WinDBG中新创建的nbl,它们都包含IP数据包(以0x45等开头)。
我必须为过滤器创建一个新的子层吗?是否因为我从与系统进程关联的工作线程调用 sendAsync 而丢弃了数据包?
【问题讨论】:
标签: networking tcp driver wfp