WFP API
Windows 筛选平台 (WFP) API 分为以下组件。
组件 | 说明 | 标头文件 |
---|---|---|
标注 API (FWPS) ${REMOVE}$ |
标注使用的数据类型。注意Microsoft Windows 驱动程序开发工具包 (DDK) 中记录了这些数据类型。 |
fwpstypes.idl |
用于实现标注的函数和枚举类型。注意这些函数和枚举类型记录在 DDK 中。 |
fwpsk.h |
|
IKE/AuthIP API (IKEEXT) ${REMOVE}$ |
用于管理 IKE 和 AuthIP main模式的枚举类型和结构 (MM) 策略和安全关联。 |
iketypes.idl |
用于管理 IKE 和 AuthIP MM 策略和安全关联的函数。 |
fwpmk.h |
|
IPsec API (IPSEC) ${REMOVE}$ |
用于管理 IPsec 策略和安全关联的枚举类型和结构。 |
ipsectypes.idl |
用于管理 IPsec 策略和安全关联的函数。 |
fwpmk.h |
|
管理 API (FWPM) ${REMOVE}$ |
用于管理筛选器引擎的枚举类型和结构。 |
fwpmtypes.idl |
用于管理筛选器引擎的函数。 这些函数用于执行以下任务:
|
fwpmk.h |
|
共享 API (FWP) | 跨 Windows 筛选平台共享的基本枚举类型和结构。 |
fwptypes.idl |
数据类型名称全部采用大写和下划线分隔。 名称始终以标识其组件组的前缀开头,例如 FWPM_PROVIDER0。
函数名称是混合大小写和大小写分隔的。 名称始终以标识其组件组的前缀开头,例如 FwpmProviderContextAdd0。
大多数数据和函数名称以版本号结尾。 fwpvi.h 头文件将与版本无关的数据和函数名称映射到适合与给定操作系统配合使用的版本。 有关详细信息,请参阅 WFP Version-Independent名称和面向 Windows 的特定版本。
每个组件都不独立。 例如,IKE main模式 (MM) 策略在 IKEEXT 组件中定义,但存储在提供程序上下文中,并与在 FWPM API 组件中找到的筛选器相关联。
User-Mode和Kernel-Mode公共头文件
大多数 WFP 函数都可以从用户模式或内核模式调用。 但是,用户模式函数返回表示 Win32 错误代码的 DWORD 值,而内核模式函数返回表示 NT 状态代码的 NTSTATUS 值。 因此,函数名称和语义在用户模式和内核模式之间是相同的,但函数签名则不同。 这需要函数原型具有单独的特定于用户模式和内核模式的标头。 用户模式头文件名以“u”结尾,内核模式头文件名以“k”结尾。
下表列出了定义 WFP 函数的 Win32 头文件。
标头文件 | 说明 |
---|---|
fwpmk.h | FWPM、IPsec 和 IKEEXT 组件的内核模式函数原型。 仅在 DDK 中可用。 |
fwpmu.h | FWPM、IPsec 和 IKEEXT 组件的用户模式函数原型。 仅在 Microsoft Windows 软件开发工具包 (SDK) 中可用。 |
fwpsk.h | FWPS 组件的内核模式函数原型和枚举类型。 仅在 DDK 中可用。 |
fwpsu.h | FWPS 组件的用户模式函数原型和枚举类型。 仅在 Windows SDK 中可用。注意 用户模式 FWPS 枚举类型与内核模式 FWPS 枚举类型相同。 因此,这些类型仅记录在 DDK 中。 注意 用户模式 FWPS 函数原型与内核模式 FWPS 函数原型相同,但返回代码除外。 用户模式 FWPS 函数返回 DWORD,而内核模式 FWPS 函数返回 NTSTATUS。 因此,这些函数仅记录在 DDK 中。 |
所有用户模式函数都从 fwpuclnt.dll 导出。 所有内核模式函数都从 fwpkclnt.sys 导出。
管理 (FWPM) 和标注 (FWPS) 数据类型
大多数用于管理任务(例如从应用程序或驱动程序添加筛选器或标注)的 FWPM 数据类型都具有 FWPS 对应项。 在用于分类的标注例程的上下文中,在网络流量的实际筛选过程中,使用 FWPS 数据类型。
例如,若要将筛选器添加到特定筛选引擎层,程序员应使用 FWPM 类型,例如: filter.layerKey = FWPM_LAYER_INBOUND_IPPACKET
。 若要检查从哪个层调用标注,程序员应使用相应的 FWPS 类型: if (inFixedValues->layerId == FWPS_LAYER_INBOUND_IPPACKET)
。
与 FWPM 数据类型对应的一些 FWPS 正在扩展原始 FWPM 数据类型。 例如,若要在多个筛选引擎层中添加筛选条件,程序员将指定 而不 filterCondition.fieldKey = FWPM_CONDITION_IP_PROTOCOL
考虑筛选引擎层。 若要查找筛选条件值,程序员会指定特定于层的 FWPS 类型,例如: inFixedValues->incomingValue[FWPS_FIELD_ALE_FLOW_ESTABLISHED_V4_IP_PROTOCOL]
。
FWPS 数据类型通常小于其对应的 FWPM 数据类型。 例如, FWPM 筛选层标识符 是 GUID (16 字节) 而 FWPS 筛选层标识符 是 UINT16 (16 位) 。 FWPS 数据类型的较小大小可提高系统性能,因为整数比较超过了实时流量的 GUID 比较。 此外,内核内存会得到有效利用,因为 FWPS 类型都在内核中用于管理筛选器,而 FWPM 类型存储在用户模式下以管理不同的层。