使用第 2 层筛选

Windows 8 及更高版本的 Windows 支持第 2 层筛选。

此 WFP 功能允许对第 2 层 MAC 标头的字段进行筛选。 对于主机发送或接收的所有数据包,将按数据包调用这些层。 在入站路径上重新组合数据包之前和出站路径上的数据包碎片之后调用层。 这些层可从 NDIS 轻型筛选器 (LWF) 驱动程序进行访问。

注意

如果标注在该层上还没有相应的筛选器,则不应在层上注入数据包。 NET_BUFFER_LIST结构的注入应与筛选器的添加和移除相协调,以便仅当筛选器存在于相应的层中时才执行注入。 此外,提供程序不应删除属于其他提供程序的筛选器。 

本节包括下列主题:

注入 MAC 帧

回调驱动程序调用 FwpsInjectMacReceiveAsync0 函数,以重新插入以前吸收的 MAC 帧 (或帧的克隆) 回第 2 层入站数据路径,或在入站数据路径中注入发明的 MAC 帧。

回调驱动程序调用 FwpsInjectMacSendAsync0 函数,以重新插入以前吸收的 MAC 帧 (或帧的克隆,) 回其截获的第 2 层出站数据路径,或在出站数据路径中注入发明的 MAC 帧。

netBufferLists 参数可以是NET_BUFFER_LIST链。 但是,每次都可以多次调用完成函数,完成链 (段或单个NET_BUFFER_LIST) 。

如果数据包与最初分类的相同筛选器匹配,则注入的帧可能会再次分类。 因此,与 IP 层的标注一样,第 2 层标注还必须通过调用 FwpsQueryPacketInjectionState0 来防止无限数据包检查。

此外,必须在注入的层上具有标注。 否则,注入 的NET_BUFFER_LIST 将不会在完成函数中完成,并且NET_BUFFER_LIST将进一步向上堆栈。 在这种情况下,行为未定义,因为 NDIS 将尝试将注入NET_BUFFER_LIST传递给堆栈中的下一个组件。

NET_BUFFER_LISTStatus 成员包含堆栈注入的状态结果。 堆栈注入的状态结果是在 WFP 注入函数返回STATUS_SUCCESS后堆栈放入NET_BUFFER_LIST 的状态。 应使用 NT_SUCCESS 宏在 Status 成员中检查堆栈注入的状态。 如果 Status 值为 STATUS_SUCCESS,则注入成功,但没有进一步的信息。 大于 STATUS_SUCCESS的状态成员值表示注入成功,但可能需要考虑有关注入的详细信息。 小于 STATUS_SUCCESS的状态成员值表示由于 Status 成员中指定的原因注入失败。

对链接网络缓冲区列表进行分类

默认情况下,标注驱动程序只能单独对网络缓冲区列表进行分类。 但是,如果标注驱动程序同时执行以下操作,则可以 对NET_BUFFER_LIST 链进行分类以提高性能:

警告

但是,如果标注驱动程序确实设置了 FWP_CALLOUT_FLAG_ALLOW_L2_BATCH_CLASSIFY 标志,则它不能使用以下函数来修改NET_BUFFER_LISTs。

设置此标志后, FwpsAllocateCloneNetBufferList0 将始终返回 INVALID_PARAMETER 错误。 这可能会意外地导致第三方标注驱动程序无法管理NET_BUFFER_LISTs的引用计数,从而导致发送和接收操作停止。

WFP 第 2 层和字段

用于虚拟交换机筛选的运行时筛选层标识符包括:

FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE

FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE

用于虚拟交换机筛选的数据字段标识符包括:

FWPS_FIELDS_INBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_OUTBOUND_MAC_FRAME_ETHERNET

FWPS_FIELDS_INBOUND_MAC_FRAME_NATIVE

FWPS_FIELDS_OUTBOUND_MAC_FRAME_NATIVE