FwpmFilterAdd0 函数 (fwpmk.h)
FwpmFilterAdd0 函数向系统添加新的筛选器对象。
语法
NTSTATUS FwpmFilterAdd0(
[in] HANDLE engineHandle,
[in] const FWPM_FILTER0 *filter,
[in, optional] PSECURITY_DESCRIPTOR sd,
[out, optional] UINT64 *id
);
参数
[in] engineHandle
筛选引擎打开的会话句柄。 调用 FwpmEngineOpen0 以打开筛选器引擎的会话。
[in] filter
要添加的筛选器对象。
[in, optional] sd
有关筛选器对象的安全信息。
[out, optional] id
此筛选器的运行时标识符。
返回值
返回代码/值 | 描述 |
---|---|
ERROR_SUCCESS 0 |
已成功添加筛选器。 |
ERROR_INVALID_SECURITY_DESCR 0x8007053A |
安全描述符结构无效。 或者,筛选器条件包含绝对格式的安全描述符。 |
FWP_E_CALLOUT_NOTIFICATION_FAILED 0x80320037 |
调用方添加了标注筛选器,标注从通知例程返回了错误。 |
FWP_E_* 错误代码 0x80320001 — 0x80320039 |
Windows 筛选平台(WFP)特定错误。 有关详细信息,请参阅 WFP 错误代码。 |
RPC_* 错误代码 0x80010001 — 0x80010122 |
无法与远程或本地防火墙引擎通信。 |
其他 NTSTATUS 代码 | 发生错误。 |
言论
FwpmFilterAdd0 将筛选器添加到系统中每个筛选层的指定子层。
FWPM_FILTER0 结构中的某些字段由系统分配,而不是调用方,在调用 FwpmFilterAdd0中将被忽略。
如果调用方提供 NULL 安全描述符,系统将分配默认的安全描述符。
若要阻止与特定位置的连接,请在 FWPM_LAYER_ALE_AUTH_CONNECT_V* 层添加指定本地地址的 FWP_ACTION_BLOCK 筛选器,或添加 FWP_ACTION_BLOCK 筛选器,而无需在 FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V* 层指定本地地址。
如果在资源分配层指定了本地地址,则隐式绑定会成功,因为地址、地址类型和端口可能会作为 FWP_EMPTY返回。
FWPM_FILTER0 结构可以将筛选器标记为启动时间或持久性筛选器。 启动时筛选器会在 TCP/IP 驱动程序启动时添加到基本筛选引擎(BFE),并在 BFE 完成初始化后删除。 在 BFE 启动时添加持久性对象。
不能从只读事务中调用此函数,它失败并 FWP_E_INCOMPATIBLE_TXN。 有关事务的详细信息,请参阅 对象管理。
调用方需要以下访问权限:
- FWPM_ACTRL_ADD 对筛选器容器的访问
- FWPM_ACTRL_ADD_LINK 访问提供程序(如果有)
- FWPM_ACTRL_ADD_LINK 对适用层的访问
- FWPM_ACTRL_ADD_LINK 对适用的子层的访问
- FWPM_ACTRL_ADD_LINK 对标注的访问权限(如果有)
- FWPM_ACTRL_ADD_LINK 访问提供程序上下文(如果有)。
有关详细信息,请参阅 访问控制。
若要添加引用标注的筛选器,请按以下顺序调用函数。
- 调用 FwpsCalloutRegister0(在 Windows 驱动程序工具包(WDK 中记录)),以向筛选器引擎注册标注。
- 调用 FwpmCalloutAdd0 将标注添加到系统。
- 调用 FwpmFilterAdd0,将引用标注的筛选器添加到系统。
默认情况下,引用已添加但尚未向筛选器引擎注册的标注的筛选器被视为阻止筛选器。
FwpmFilterAdd0 是 FwpmFilterAdd 的特定实现。 有关详细信息,请参阅 WFP Version-Independent 名称和面向特定版本的 Windows。
例子
以下C++示例演示如何使用 FwpmFilterAdd0 初始化和添加筛选器,这些筛选器专门阻止所有应用程序的 IP V4 上的流量。
// Add filter to block traffic on IP V4 for all applications.
//
FWPM_FILTER0 fwpFilter;
FWPM_SUBLAYER0 fwpFilterSubLayer;
RtlZeroMemory(&fwpFilter, sizeof(FWPM_FILTER0));
fwpFilter.layerKey = FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4;
fwpFilter.action.type = FWP_ACTION_BLOCK;
if (&fwpFilterSubLayer.subLayerKey != NULL)
fwpFilter.subLayerKey = fwpFilterSubLayer.subLayerKey;
fwpFilter.weight.type = FWP_EMPTY; // auto-weight.
fwpFilter.numFilterConditions = 0; // this applies to all application traffic
fwpFilter.displayData.name = L"Receive/Accept Layer Block";
fwpFilter.displayData.description = L"Filter to block all inbound connections.";
printf("Adding filter to block all inbound connections.\n");
result = FwpmFilterAdd0(engineHandle, &fwpFilter, NULL, NULL);
if (result != ERROR_SUCCESS)
printf("FwpmFilterAdd0 failed. Return value: %d.\n", result);
else
printf("Filter added successfully.\n");
要求
要求 | 价值 |
---|---|
最低支持的客户端 | 从 Windows Vista 开始可用。 |
目标平台 | 普遍 |
标头 | fwpmk.h |
库 | fwpkclnt.lib |
IRQL | <= PASSIVE_LEVEL |