当筛选器引擎调用标注驱动程序的 分类Fn 标注函数时,它会将指针传递给 layerData 参数中的结构。 对于筛选数据包数据的层,指针引用 NET_BUFFER_LIST 结构。 根据调用 classifyFn 标注函数的筛选层,筛选器引擎将 layerData* 参数中的指针传递给以下结构之一:
对于流层, layerData 参数包含指向 FWPS_STREAM_CALLOUT_IO_PACKET0 结构的指针。 此结构的 streamData 成员包含指向 FWPS_STREAM_DATA0 结构的指针。
FWPS_STREAM_DATA0结构的 netBufferListChain 成员包含指向NET_BUFFER_LIST结构的指针。
对于所有其他层, layerData 参数包含指向 NET_BUFFER_LIST 结构的指针。
注释
layerData 参数可能是 NULL,具体取决于要筛选的层以及调用驱动程序的 classifyFn 标注函数的条件。
NET_BUFFER_LIST结构包含NET_BUFFER结构的链接列表。 在每个NET_BUFFER结构中的NET_BUFFER_DATA结构内,DataOffset成员指示数据包数据中的特定位置。 DataOffset 成员指向的位置取决于筛选器引擎调用标注驱动程序的分类Fn 标注函数的筛选层。
对于每个筛选层, DataOffset 成员指定的数据包数据中的位置定义如下:
| 运行时筛选层标识符(从 Windows Vista 开始) | 数据包数据中的位置 |
|---|---|
|
FWPS_LAYER_INBOUND_IPPACKET_V4 FWPS_LAYER_INBOUND_IPPACKET_V6 |
传输标头的开头。 |
|
FWPS_LAYER_INBOUND_IPPACKET_V4_DISCARD FWPS_LAYER_INBOUND_IPPACKET_V6_DISCARD |
TCP/IP 堆栈停止处理的偏移量。 |
|
FWPS_LAYER_OUTBOUND_IPPACKET_V4 FWPS_LAYER_OUTBOUND_IPPACKET_V6 |
IP 标头的开头。 |
|
FWPS_LAYER_OUTBOUND_IPPACKET_V4_DISCARD FWPS_LAYER_OUTBOUND_IPPACKET_V6_DISCARD |
TCP/IP 堆栈停止处理的偏移量。 |
|
FWPS_LAYER_IPFORWARD_V4 FWPS_LAYER_IPFORWARD_V6 |
IP 标头的开头。 |
|
FWPS_LAYER_IPFORWARD_V4_DISCARD FWPS_LAYER_IPFORWARD_V6_DISCARD |
IP 标头的开头。 |
|
FWPS_LAYER_INBOUND_TRANSPORT_V4 FWPS_LAYER_INBOUND_TRANSPORT_V6 |
数据的开头。
注意 对于 TCP/IP 堆栈 ICMP 套接字上收到的入站数据包,偏移量是 ICMP 标头的开头。
|
|
FWPS_LAYER_INBOUND_TRANSPORT_V4_DISCARD FWPS_LAYER_INBOUND_TRANSPORT_V6_DISCARD |
数据的开头。
注意 对于 TCP/IP 堆栈 ICMP 套接字上收到的入站数据包,偏移量是 ICMP 标头的开头。
|
|
FWPS_LAYER_OUTBOUND_TRANSPORT_V4 FWPS_LAYER_OUTBOUND_TRANSPORT_V6 |
传输标头的开头。 |
|
FWPS_LAYER_OUTBOUND_TRANSPORT_V4_DISCARD FWPS_LAYER_OUTBOUND_TRANSPORT_V6_DISCARD |
传输标头的开头。 |
|
FWPS_LAYER_STREAM_V4 FWPS_LAYER_STREAM_V6 |
数据的开头。
注意 数据包数据中的位置不包含 IP、IPv6 和传输标头。
|
|
FWPS_LAYER_STREAM_V4_DISCARD FWPS_LAYER_STREAM_V6_DISCARD |
数据的起始部分。
注意 数据包数据中的位置不包含 IP、IPv6 或传输标头。
|
|
FWPS_LAYER_DATAGRAM_DATA_V4 FWPS_LAYER_DATAGRAM_DATA_V6 |
对于入站数据报:数据的开头。
注意 对于 TCP/IP 堆栈 ICMP 套接字上收到的入站数据包,偏移量是 ICMP 标头的开头。
对于出站数据报:传输标头的开头。 |
|
FWPS_LAYER_DATAGRAM_DATA_V4_DISCARD FWPS_LAYER_DATAGRAM_DATA_V6_DISCARD |
对于入站数据报:数据的开头。
注意 对于 TCP/IP 堆栈 ICMP 套接字上收到的入站数据包,偏移量是 ICMP 标头的开头。
对于出站数据报:传输标头的开头。 |
|
FWPS_LAYER_INBOUND_ICMP_ERROR_V4 FWPS_LAYER_INBOUND_ICMP_ERROR_V6 |
内部 IP 标头的开头。 |
|
FWPS_LAYER_INBOUND_ICMP_ERROR_V4_DISCARD FWPS_LAYER_INBOUND_ICMP_ERROR_V6_DISCARD |
内部 IP 标头的开头。 |
|
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4 FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6 |
ICMP 标头的开头。 |
|
FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4_DISCARD FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6_DISCARD |
ICMP 标头的开头。 |
|
FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4 (分配资源层) FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6 |
不適用。 |
|
FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD FWPS_LAYER_ALE_RESOURCE_ASSIGNMENT_V6_DISCARD |
不適用。 |
|
FWPS_LAYER_ALE_AUTH_LISTEN_V4 FWPS_LAYER_ALE_AUTH_LISTEN_V6 |
不適用。 |
|
FWPS_LAYER_ALE_AUTH_LISTEN_V4_DISCARD FWPS_LAYER_ALE_AUTH_LISTEN_V6_DISCARD |
不適用。 |
|
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4 FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6 |
对于入站数据包方向:数据的开头。
注意 对于 TCP/IP 协议栈 ICMP 套接字上收到的入站数据包,偏移量是 ICMP 标头的开头。
对于出站数据包方向:传输标头的开头。 |
|
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6_DISCARD |
对于入站数据包方向:数据的开头。
注意 对于通过 TCP/IP 协议栈上的 ICMP 套接字接收到的入站数据包,偏移量是 ICMP 头的起始位置。
对于出站数据包方向:传输标头的开头。 |
|
FWPS_LAYER_ALE_AUTH_CONNECT_V4 FWPS_LAYER_ALE_AUTH_CONNECT_V6 |
对于非 TCP 流量:传输标头的开头。 对于 TCP 流量:不适用。 |
|
FWPS层_ALE_AUTH_CONNECT_V4丢弃 FWPS_LAYER_ALE_AUTH_CONNECT_V6_DISCARD |
对于非 TCP 流量:传输标头的开头。 对于 TCP 流量:不适用。 |
|
FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4 FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6 |
对于入站数据包方向:数据的开头。
注意 对于通过 TCP/IP 协议栈上的 ICMP 套接字接收到的入站数据包,偏移量是 ICMP 头的起始位置。
对于出站数据包方向:传输标头的开头。 |
|
FWPS_LAYER_ALE_FLOW_ESTABLISHED_V4_DISCARD FWPS_LAYER_ALE_FLOW_ESTABLISHED_V6_DISCARD |
对于入站数据包方向:数据的开头。
注意 对于通过 TCP/IP 协议栈上的 ICMP 套接字接收到的入站数据包,偏移量是 ICMP 头的起始位置。
对于出站数据包方向:传输标头的开头。 |
|
FWPS_LAYER_IPSEC_KM_DEMUX_V4 FWPS_LAYER_IPSEC_KM_DEMUX_V6 |
不適用。 |
|
FWPS_LAYER_IPSEC_V4 FWPS_LAYER_IPSEC_V6 |
不適用。 |
|
FWPS_LAYER_IKEEXT_V4 FWPS_LAYER_IKEEXT_V6 |
不適用。 |
|
FWPS_LAYER_RPC_UM |
不適用。 |
|
FWPS_LAYER_RPC_EPMAP |
不適用。 |
|
FWPS_LAYER_RPC_EP_ADD |
不適用。 |
|
FWPS_LAYER_RPC_PROXY_CONN |
不適用。 |
|
FWPS_LAYER_RPC_PROXY_IF |
不適用。 |
| 运行时筛选层标识符(从 Windows 7 开始) | 数据包数据中的位置 |
|
FWPS_LAYER_NAME_RESOLUTION_CACHE_V4 FWPS_LAYER_NAME_RESOLUTION_CACHE_V6 (名称解析缓存层V6) |
不適用。 |
|
FWPS_LAYER_ALE_RESOURCE_RELEASE_V4 FWPS_LAYER_ALE_RESOURCE_RELEASE_V6 |
不適用。 |
|
FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V4 FWPS_LAYER_ALE_ENDPOINT_CLOSURE_V6 |
不適用。 |
|
FWPS_LAYER_ALE_CONNECT_REDIRECT_V4 FWPS_LAYER_ALE_CONNECT_REDIRECT_V6(连接重定向层) |
不適用。
注意 对于这些筛选层, layerData 参数包含指向 FWPS_CONNECT_REQUEST0 结构的指针。 此结构不引用描述数据包数据的 NET_BUFFER_LIST 结构。
|
|
FWPS_LAYER_ALE_BIND_REDIRECT_V4 FWPS_LAYER_ALE_BIND_REDIRECT_V6 |
不適用。
注意 对于这些筛选层, layerData 参数包含指向 FWPS_BIND_REQUEST0 结构的指针。 此结构不引用描述数据包数据的 NET_BUFFER_LIST 结构。
|
|
FWPS_LAYER_STREAM_PACKET_V4 FWPS_LAYER_STREAM_PACKET_V6 |
对于入站数据包方向:数据的开头。 对于出站数据包方向:传输标头的开头。 |
|
FWPS_LAYER_KM_AUTHORIZATION |
不適用。 |
| 运行时筛选层标识符(从 Windows 8 开始) | 数据包数据中的位置 |
|
FWPS_LAYER_INBOUND_MAC_FRAME_ETHERNET |
IP 标头的开头。 |
|
FWPS_LAYER_OUTBOUND_MAC_FRAME_ETHERNET |
MAC 标头的开头。 |
|
FWPS_LAYER_INBOUND_MAC_FRAME_NATIVE |
MAC 标头的开头。 |
|
FWPS_LAYER_OUTBOUND_MAC_FRAME_NATIVE |
MAC 标头的开头。 |
|
FWPS_LAYER_INGRESS_VSWITCH_ETHERNET |
以太网标头的开头。 |
|
FWPS_LAYER_EGRESS_VSWITCH_ETHERNET |
以太网标头的开头。 |
|
FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V4 |
IP 标头的开头。 |
|
FWPS_LAYER_INGRESS_VSWITCH_TRANSPORT_V6 |
IP 标头的开头。 |
|
FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V4 |
IP 标头的开头。 |
|
FWPS_LAYER_EGRESS_VSWITCH_TRANSPORT_V6 |
IP 标头的开头。 |