返回

如何在 Windows 7 上解决 WFP 驱动程序中的“STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS”错误?

windows

解决 Windows 7 上 WFP 驱动程序的 FwpmProviderAdd() STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS 错误

简介

在为 Windows 开发 WFP(Windows 筛选平台)驱动程序时,您可能遇到在 Windows 7 上安装驱动程序时出现 "STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS" 错误的情况。此错误表示系统正在更新网络安全策略或配置信息,从而导致 WFP 策略或配置信息不可用。

原因分析

"STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS" 错误是由正在进行的动态会话引起的。在动态会话期间,某些 WFP 策略或配置信息可能不可用,从而导致 FwpmProviderAdd() 函数调用失败。

解决方案

要解决此问题,您可以尝试以下解决方案:

  • 使用 FwpmProviderAddFlags(): 在调用 FwpmProviderAdd() 时,使用 FWPM_PROVIDER_ADD_FLAG_IGNORE_EMBEDDED_POLICY 标志来忽略嵌入式策略信息。
  • 使用事务: 将 FwpmProviderAdd() 和任何其他必需的 WFP 操作放入事务中。如果动态会话在事务期间发生,所有操作都将回滚。
  • 等待策略更新完成: 在调用 FwpmProviderAdd() 之前,等待策略更新完成。您可以使用 FwpmNetEventSubscribe0() 函数订阅网络事件,并在策略更新完成后收到通知。

示例代码

使用 FwpmProviderAddFlags() 标志忽略嵌入式策略信息:

FWPM_PROVIDER provider;
FWPM_PROVIDER_FLAGS flags = FWPM_PROVIDER_ADD_FLAG_IGNORE_EMBEDDED_POLICY;

status = FwpmProviderGetByKey(g_EngineHandle, &providerGuid, &pExistingProvider);
if (!NT_SUCCESS(status) || !pExistingProvider) {
    RtlZeroMemory(&provider, sizeof(provider));
    provider.providerKey = providerGuid;
    provider.displayData.name = L"Testing Provider";
    provider.displayData.description = L"This is for testing";
    //provider.flags = FWPM_PROVIDER_FLAG_PERSISTENT;
    provider.serviceName = L"wfptest";
    status = FwpmProviderAdd(g_EngineHandle, &provider, &flags);
    if (!NT_SUCCESS(status)) {
        TB_TRACE(TS_CRIT, TA_PACKET, ("ProviderAdd Fail = %#08x!!!!", status));
        goto _Exit;
    }
}

结论

通过应用本文提供的解决方案,您应该能够解决在 Windows 7 上 WFP 驱动程序中发生的 "STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS" 错误。

常见问题解答

  1. 此错误只会在 Windows 7 上发生吗?
    不,此错误也可能在其他 Windows 版本中发生,例如 Windows 8 和 Windows 10。

  2. 为什么在更新策略或配置信息时会出现此错误?
    因为 WFP 在更新策略或配置信息时需要访问某些信息。如果这些信息不可用,则会导致此错误。

  3. 如何确定系统是否正在进行动态会话?
    您可以使用 FwpmNetEventSubscribe0() 函数订阅网络事件,并在策略更新完成后收到通知。

  4. 我尝试了提供的解决方案,但仍然出现错误。怎么办?
    请尝试使用不同的解决方案或检查 WFP 驱动程序是否有其他问题。

  5. 这个错误有什么其他可能的解决方法?
    其他可能的解决方法包括使用 WFP 诊断工具或启用 WFP 日志记录以进行故障排除。