如何在 Windows 7 上解决 WFP 驱动程序中的“STATUS_FWP_DYNAMIC_SESSION_IN_PROGRESS”错误?
2024-03-17 11:14:56
解决 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" 错误。
常见问题解答
-
此错误只会在 Windows 7 上发生吗?
不,此错误也可能在其他 Windows 版本中发生,例如 Windows 8 和 Windows 10。 -
为什么在更新策略或配置信息时会出现此错误?
因为 WFP 在更新策略或配置信息时需要访问某些信息。如果这些信息不可用,则会导致此错误。 -
如何确定系统是否正在进行动态会话?
您可以使用 FwpmNetEventSubscribe0() 函数订阅网络事件,并在策略更新完成后收到通知。 -
我尝试了提供的解决方案,但仍然出现错误。怎么办?
请尝试使用不同的解决方案或检查 WFP 驱动程序是否有其他问题。 -
这个错误有什么其他可能的解决方法?
其他可能的解决方法包括使用 WFP 诊断工具或启用 WFP 日志记录以进行故障排除。