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事件被用户应用程序接收或被丢弃(过滤器不匹配或超时)。

1085

被折叠的 条评论
为什么被折叠?



