WinDivert学习文档之十-————可能遇到的问题

10. 可能遇到的问题
WinDivert有一些已知的限制如下:

  • 注入入站ICMP/ICMPv6消息:对于某些类型的入站ICMP/ICMPv6消息,调用WinDivertSend()将失败并报错。这可能是因为Windows TCP/IP栈不处理这样的消息。这样的错误是无害的,可以忽略。
  • 转发层不能很好地与Windows NAT交互:使用WinDivert无法阻止NAT前的数据包。作为一般原则,您不应该尝试将转发层的WinDivert与Windows NAT实现混合使用。
  • 重新注入未修改的数据包会导致无限循环:如果两个或更多的Windows过滤平台(WFP) callout驱动程序(包括WinDivert应用程序)阻塞并注入未修改的数据包副本,那么这可能会导致无限循环。如果发生这样的循环,WinDivertSend()最终将失败,错误ERROR_HOST_UNREACHABLE。不幸的是,这样的错误不容易修复。一些粗略的解决方案包括:(1)移除不兼容的驱动程序,或(2)忽略所有带有ip的数据包。TTL或ipv6。HopLimit小于Windows DefaultTTL注册表值。有关更多信息,请参阅GitHub issue #41。
  • WinDivert可能导致MSVC x86_64调试器死锁:由于调试器使用本地套接字而发生死锁。因此:调试器暂停WinDivert应用程序,它停止处理数据包,这导致调试器永远等待来自套接字的输入。可以通过忽略环回流量来避免死锁。有关更多信息,请参阅GitHub issue #26。
  • WinDivert可能导致数据包乱序:简单地运行passthru.exe示例程序可能导致数据包乱序。这不是一个错误,因为没有要求数据包保持有序。然而,这可能会影响其他错误的软件(例如一些错误的NAT实现),这些软件错误地认为数据包是有序的。
  • addr.*之间存在竞争条件。processId和进程终止。当使用WinDivertRecv()接收事件时,负责该事件的进程可能已经终止。此外,理论上有可能将processId重新分配给不相关的进程。通过比较时间戳(addr.Timestamp)和进程的创建时间,可以部分缓解这个问题。如果进程较新,则ID已被重新分配。这个竞争条件不影响WINDIVERT_EVENT_REFLECT_OPEN事件。在这种特殊情况下,addr.Reflect.processId保证有效,直到相应的WINDIVERT_EVENT_REFLECT_CLOSE事件被用户应用程序接收或被丢弃(过滤器不匹配或超时)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jyl_sh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值