我正在开发应为系统上每个连接收集进/出流量统计信息的应用程序。 我的想法是使用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}”,但这也无法解决问题。
问题是:
这是源代码。
// 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_
);
}
任何想法都值得赞赏! 谢谢!