FwpmFilterAdd0 函数 (fwpmu.h)

FwpmFilterAdd0 函数向系统添加新的筛选器对象。

语法

DWORD FwpmFilterAdd0(
  [in]            HANDLE               engineHandle,
  [in]            const FWPM_FILTER0   *filter,
  [in, optional]  PSECURITY_DESCRIPTOR sd,
  [out, optional] UINT64               *id
);

参数

[in] engineHandle

类型: HANDLE

筛选器引擎的打开会话的句柄。 调用 FwpmEngineOpen0 以打开与筛选器引擎的会话。

[in] filter

类型: FWPM_FILTER0*

要添加的筛选器对象。

[in, optional] sd

类型: SECURITY_DESCRIPTOR

有关筛选器对象的安全信息。

[out, optional] id

类型: UINT64*

此筛选器的运行时标识符。

返回值

类型:DWORD

返回代码/值 说明
ERROR_SUCCESS
0
已成功添加筛选器。
ERROR_INVALID_SECURITY_DESCR
0x8007053A
安全描述符结构无效。 或者,筛选条件包含绝对格式的安全描述符。
FWP_E_CALLOUT_NOTIFICATION_FAILED
0x80320037
调用方添加了标注筛选器,并且标注从其通知例程返回了错误。
FWP_E_* 错误代码
0x80320001— 0x80320039
Windows 筛选平台 (WFP) 特定错误。 有关详细信息 ,请参阅 WFP 错误代码
RPC_* 错误代码
0x80010001 — 0x80010122
无法与远程或本地防火墙引擎通信。

注解

FwpmFilterAdd0 将筛选器添加到系统中每个筛选层的指定子层。

FWPM_FILTER0 结构中的某些字段由系统而不是调用方分配,并在调用 FwpmFilterAdd0 时被忽略。

如果调用方提供 NULL 安全描述符,系统将分配默认的安全描述符。

若要阻止与特定位置的连接,请添加 一个FWP_ACTION_BLOCK 筛选器,指定 FWPM_LAYER_ALE_AUTH_CONNECT_V* 层的本地地址,或添加 一个FWP_ACTION_BLOCK 筛选器,而不指定 FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V* 层的本地地址。

注意

如果在资源分配层指定了本地地址,则隐式绑定会成功,因为地址、地址类型和端口可能会作为 FWP_EMPTY返回。

FWPM_FILTER0 结构可以将筛选器标记为启动时筛选器或持久性筛选器。 启动时间筛选器在 TCP/IP 驱动程序启动时添加到基本筛选引擎 (BFE) ,并在 BFE 完成初始化后删除。 在 BFE 启动时添加永久性对象。

不能从只读事务中调用此函数。 它将失败并 FWP_E_INCOMPATIBLE_TXN。 有关事务的详细信息,请参阅 对象管理

调用方需要以下访问权限:

有关详细信息,请参阅访问控制

若要添加引用标注的筛选器,请按以下顺序调用函数。

  • 调用 Windows 驱动程序工具包 (WDK) ) 中所述的 FwpsCalloutRegister0 (,将标注注册到筛选器引擎。
  • 调用 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 [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 fwpmu.h
Library Fwpuclnt.lib
DLL Fwpuclnt.dll

另请参阅

FWPM_FILTER0

管理功能

WFP 函数