Windivert过滤器错误:IfIdx

时间:2017-03-17 10:35:19

标签: c++ windows networking filter interface

我正在尝试使用以下过滤器来转移包但它失败了:

WinDivertOpen("IfIdx == X", WINDIVERT_LAYER::WINDIVERT_LAYER_NETWORK, 0, 0);

我正在品尝一个程序,该程序必须从索引为X(0,1,2,...)的特定接口转移流量,但是我得到错误代码号87,这表示无效的数据包过滤字符串,图层,优先权或旗帜。

如果我尝试使用其他过滤器,如“tcp”它可以工作,但我只需要将过滤器应用于我已经知道其索引的特定接口。如果这个过滤器键不起作用..我能做什么解决方案?。

以下是文档:https://reqrypt.org/windivert-doc.html#filter_language

问候并感谢你。

编辑:我也试过了:

handle = WinDivertOpen("true", WINDIVERT_LAYER::WINDIVERT_LAYER_NETWORK, 0, 0);

if (handle == INVALID_HANDLE_VALUE)
    printf("ERROR WINDIVERT: %d", GetLastError());

else
{
    while (TRUE)
    {
        if (WinDivertRecv(handle, packet, sizeof(packet), &addr, &packetLen))
        {
            if (addr.IfIdx != X)
            {
                WinDivertSend(handle, packet, packetLen, &addr, NULL);
            }
        }
    }

    WinDivertClose(handle);

但它阻止了所有接口的流量,并且不仅阻止了索引为X的特定接口的流量。

1 个答案:

答案 0 :(得分:0)

我认为问题在于,当正确的令牌为IfIdx(小写ifIdx)时,您正在使用i。顺便说一下,如果你升级到WinDivert1.2,你可以使用WinDivertHelperCheckFilter函数来获得更有用的错误信息。

至于你的编辑;可能是一些问题,例如在WinDivertSend之前没有重新计算校验和(如有必要)。请参阅passthru.c示例程序。