RecognizeFrame 回调函数

RecognizeFrame 导出函数指示是否将一段数据识别为分析程序检测到的协议。 必须为分析程序 DLL 支持的每个分析程序实现 RecognizeFrame 导出函数。

语法

LPBYTE RecognizeFrame(
  _In_    HFRAME      hFrame,
  _In_    LPBYTE      lpFrame,
  _In_    LPBYTE      lpProtocol,
  _In_    DWORD       MacType,
  _In_    DWORD       BytesLeft,
  _In_    HPROTOCOL   hPreviousProtocol,
  _In_    DWORD       nPreviousProtocolOffset,
  _Out_   LPDWORD     ProtocolStatusCode,
  _Out_   LPHPROTOCOL phNextProtocol,
  _Inout_ PDWORD_PTR  lpInstData
);

参数

hFrame [in]

包含数据的帧的句柄。

lpFrame [in]

指向帧的第一个字节的指针。 该指针提供了查看其他分析程序识别的数据的方法。

lpProtocol [in]

指向未认领数据的开头的指针。 通常,未认领的数据位于帧中间,因为以前的分析程序在此分析器之前已声明数据。 分析程序必须首先测试未认领的数据。

MacType [in]

帧中第一个协议的 MAC 值。 通常,当分析程序必须标识帧中的第一个协议时,将使用 MacType 值。 MacType 值可以是下列值之一:

含义
MAC_TYPE_ETHERNET
802.3
MAC_TYPE_TOKENRING
802.5
MAC_TYPE_FDDI
ANSI X3T9.5

BytesLeft [in]

帧中某个位置到帧末尾的剩余字节数。

hPreviousProtocol [in]

上一协议的句柄。

nPreviousProtocolOffset [in]

帧开头的上一个协议的偏移量。

ProtocolStatusCode [out]

协议状态指示器。 分析程序 DLL 必须设置以下状态代码之一。

含义
PROTOCOL_STATUS_RECOGNIZED
分析器可识别数据,但不知道哪个协议遵循。 设置代码后,返回指向遵循已识别协议的剩余未认领数据的指针。 网络监视器使用 以下协议集 继续分析。
PROTOCOL_STATUS_NOT_RECOGNIZED
分析程序无法识别数据。 设置此代码后,使用 lpProtocol 参数传递给分析程序 DLL 的指针返回指向数据开头的指针。 网络监视器使用上一个协议的 以下集 继续分析。
PROTOCOL_STATUS_CLAIMED
分析器识别数据并声明剩余数据。 设置代码后,返回网络监视器以终止分析帧的 NULL
PROTOCOL_STATUS_NEXT_PROTOCOL
分析程序可识别数据并知道遵循哪个协议。 设置代码后,设置 phNextProtocol 参数,并返回指向遵循已识别协议的剩余未认领数据的指针。 网络监视器继续分析帧。

phNextProtocol [out]

指向下一个协议句柄的指针。 当协议标识遵循协议的协议时,将设置此参数。 若要获取下一个协议的句柄,请调用 GetProtocolFromTable 函数。

lpInstData [in, out]

输入时,指向上一协议中的实例数据的指针。

在输出中,指向当前协议的实例数据的指针。 实例数据长度不能超过DWORD_PTR。

返回值

如果函数成功,则返回值是指向识别分析器数据后第一个字节的指针。 如果分析程序声明所有剩余的数据,则返回值为 NULL

如果函数失败,则返回值是 lpProtocol 参数传入的初始指针。

注解

RecognizeFrame 函数确定分析程序是否识别从 lpProtocol 指针开始的原始数据。

  • 如果协议识别数据, RecognizeFrame 函数将返回指向剩余数据的指针,或者如果当前协议是帧中的最后一个协议,则返回 NULL
  • 如果协议无法识别数据, RecognizeFrame 函数将返回传递给 lpProtocol 参数中的分析程序 DLL 的指针。

注意

可以在调用 Register 函数以注册协议属性之前调用 RecognizeFrame。 因此, RecognizeFrame 函数的实现不依赖于在协议 Register 函数实现过程中创建或初始化的任何属性或结构。

移交集和关注集

分析程序可以使用交接集或关注集来标识网络监视器后面的已识别数据的协议。

  • 如果信息在识别的数据中可用,分析器使用其移交集获取下一个协议的句柄,然后将该句柄传递给网络监视器。
  • 如果信息不可用,分析程序不会传递句柄,网络监视器使用分析程序后跟集来确定哪个协议遵循。

在协议之间传递信息

使用 lpInstData 参数在协议之间传递信息。 输入时,可以从以前的协议中检索信息。 在输出中,可以将信息传递给下一个协议。

实例数据可以是长度小于或等于DWORD_PTR的任何数据,也可以是指向数据(如原始帧数据)的指针,不需要由分析器分配或释放数据。

有关信息 请参阅
分析程序是什么,以及它们如何使用网络监视器。 分析器
分析器 DLL 中包含哪些入口点。 分析器 DLL 体系结构
如何实现 RecognizeFrame 包括一个示例。 实现 RecognizeFrame
如何指定交接集并遵循集。 指定 HandoffSetSpecing a Follow Set

要求

要求
最低受支持的客户端
Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器
Windows 2000 Server [仅限桌面应用]
标头
Netmon.h

另请参阅

GetProtocolFromTable