使用WFP用户模式API接收进/出流量统计信息

时间:2020-07-22 15:39:46

标签: windows wfp

我正在开发应为系统上每个连接收集进/出流量统计信息的应用程序。 我的想法是使用WFP的“ FwpmConnectionSubscribe0”函数来注册回调函数并开始接收“ FWPM_CONNECTION_EVENT_TYPE”和“ FWPM_CONNECTION0”对象。

FWPM_CONNECTION_EVENT_TYPE”将允许检测连接打开和关闭事件(FWPM_CONNECTION_EVENT_ADD,FWPM_CONNECTION_EVENT_DELETE)。 “ FWPM_CONNECTION0”允许获取连接详细信息,例如IP地址和输入/输出字节传输的字节。

但是当测试应用准备就绪时,我似乎没有收到任何连接事件。没有运行时错误或类似的东西。它只是不接收任何事件。 我以为问题可能出在访问权限上,但是该应用程序以管理员身份运行,并且具有必需的访问权限。另一个想法是关于粮食计划署的政策。我认为所需的政策已被禁用。因此,我启用了以下内容:“ Filtering Platform Connection {0CCE9226-69AE-11D9-BED3-505054503030}”,但这也无法解决问题。

问题是:

  • 是否可以使用用户模式WFP方法获得操作系统中每个连接的进/出流量统计信息,而无需执行内核模式标注驱动程序?
  • 订阅无效的连接事件是什么原因?

这是源代码。

// BFE session initialization.
{
    FWPM_SESSION session;
    std::memset(&session, 0, sizeof(session));

    session.sessionKey = <Key>;
    session.flags |= FWPM_SESSION_FLAG_DYNAMIC;
    session.displayData.name = BFE_SESSION_NAME;
    session.displayData.description = BFE_SESSION_DESC;

    const auto error = FwpmEngineOpen(
        NULL, RPC_C_AUTHN_WINNT, NULL, &session, &handle_
    );
}

// Connection events subscription initialization.
{
    FWPM_CONNECTION_SUBSCRIPTION subscription;
    subscription.enumTemplate = NULL;
    subscription.flags = 0;
    subscription.sessionKey = BfeSession::Key();

    const auto error = FwpmConnectionSubscribe(
        session.Handle(),
        &subscription,
        (FWPM_CONNECTION_CALLBACK)&ConnectionsCallback,
        NULL,
        &handle_
    );
}

任何想法都值得赞赏! 谢谢!

0 个答案:

没有答案