使用数据包标记

标注驱动程序可以标记感兴趣的数据包,并接收标记的数据包上发生的事件的通知。 Windows 7 及更高版本的 Windows 支持数据包标记。

若要使用数据包标记,标注驱动程序必须实现 FWPS_NET_BUFFER_LIST_NOTIFY_FN0FWPS_NET_BUFFER_LIST_NOTIFY_FN1 回调函数。 此函数将接收标记数据包的所有状态通知。 在标记单个数据包之前,标注驱动程序必须通过调用 FwpsNetBufferListGetTagForContext0 获取特殊的上下文标记。 标注驱动程序可以对部分或所有标记的数据包使用相同的上下文标记。 例如,标注驱动程序可能会使用不同的上下文标记来区分标记数据包的类型。

为了标记数据包,标注驱动程序使用 NET_BUFFER_LIST 结构。 标注驱动程序调用 FwpsNetBufferListAssociateContext0 以标记单个 NET_BUFFER_LIST 结构。 标注驱动程序与数据包关联的上下文是任意无符号 64 位值。 触发事件时, FWPS_NET_BUFFER_LIST_NOTIFY_FN0FWPS_NET_BUFFER_LIST_NOTIFY_FN1 回调将上下文作为输入参数传递,以便标注驱动程序可以标识单个标记的数据包。 筛选引擎不使用或评估上下文。 它仅传递给回调以供标注驱动程序使用。

当数据包离开堆栈时,会自动从标记的数据包中删除上下文。 但是,如果数据包从未进入 TCP/IP 堆栈(例如,对于 NDIS 筛选器驱动程序),则需要通过调用 FwpsNetBufferListRemoveContext0 手动删除上下文,并将 netBufferList 参数设置为 NULL

如果标注需要提前中止标记操作,可以通过调用 FwpsNetBufferListRemoveContext0 来删除上下文。 删除上下文通常会触发 FWPS_NET_BUFFER_LIST_CONTEXT_REMOVED 事件。 有关可以触发的事件的详细信息,请参阅 FWPS_NET_BUFFER_LIST_EVENT_TYPE0 枚举。 在某些情况下,不会触发任何事件,例如当数据包从未进入 TCP/IP 堆栈进行处理时。

克隆标记的数据包时,标注驱动程序可以将上下文移动或复制到克隆数据包。 若要在克隆) 的情况下移动上下文 (,标注驱动程序必须调用 FwpsNetBufferListRetrieveContext0 ,并将 removeContext 参数设置为 TRUE。 然后,上下文可以与新数据包相关联。 复制) 复制上下文 (的过程是相同的,只不过 FwpsNetBufferListRetrieveContext0removeContext 参数必须设置为 FALSE

可以从 NDIS 筛选器驱动程序检索从 TCP/IP 层标记的数据包。 反之亦然。 数据包标记在除数据段外没有指示数据包的流层中不可用。

标注驱动程序可以通过调用 FwpsNetBufferListRetrieveContext0 来检索FWPS_NET_BUFFER_LIST_NOTIFY_FN0FWPS_NET_BUFFER_LIST_NOTIFY_FN1函数外部的数据包的上下文。 通常,标注驱动程序将在其 classifyFn 回调中检索上下文。

classifyFn

FWPS_NET_BUFFER_LIST_EVENT_TYPE0

FWPS_NET_BUFFER_LIST_NOTIFY_FN0

FWPS_NET_BUFFER_LIST_NOTIFY_FN1

FwpsNetBufferListAssociateContext0

FwpsNetBufferListGetTagForContext0

FwpsNetBufferListRemoveContext0

FwpsNetBufferListRetrieveContext0

NET_BUFFER_LIST

NDIS 筛选器驱动程序