实现 RecognizeFrame

网络监视器调用分析程序的 RecognizeFrame 函数,以确定分析程序识别帧的未认领数据。 未认领的数据可能位于帧的开头,但通常,未认领的数据位于帧中间。 下图显示了位于帧中间的未认领数据。

位于帧中间的未认领数据

网络监视器在调用 RecognizeFrame 函数时提供以下信息:

  • 帧的句柄。
  • 指向帧开头的指针。
  • 指向未认领数据的开头的指针。
  • 帧中第一个协议的 MAC 值。
  • 未认领的数据中的字节数;即帧中剩余的字节。
  • 上一个协议的句柄。
  • 上一个协议的偏移量。

当分析程序 DLL 确定未认领的数据以分析程序协议开头时,分析程序 DLL 将确定下一个协议的开始位置以及遵循的协议。 分析程序 DLL 按以下条件方式运行:

  • 如果分析程序 DLL 识别未认领的数据,则分析程序 DLL 将设置 pProtocolStatus 参数,并返回指向帧中下一个协议的指针或 NULL。 如果当前协议是帧中的最后一个协议,则返回 NULL
  • 如果分析程序 DLL 识别未认领的数据,并从协议) 中提供的信息标识 (协议,则分析程序 DLL 将返回指向函数 的 phNextProtocol 参数中下一个协议句柄的指针。
  • 如果分析程序 DLL 无法识别未认领的数据,则分析程序 DLL 将返回指向未认领数据的开头的指针,并且网络监视器继续尝试分析未认领的数据。

实现 RecognizeFrame

  1. 测试以确定你识别协议。

  2. 如果识别未认领的数据并且知道遵循哪个协议,请将 pProtocolStatus 设置为 PROTOCOL_STATUS_NEXT_PROTOCOL,将 phNextProtocol 设置为指向下一个协议句柄的指针,然后返回指向下一个协议的指针。

    –或者–

    如果识别未认领的数据,但不知道遵循哪个协议,请将 pProtocolStatus 设置为 PROTOCOL_STATUS_RECOGNIZED,然后返回指向下一个协议的指针。

    –或者–

    如果识别未认领的数据,并且协议是帧中的最后一个协议,请将 pProtocolStatus 设置为 PROTOCOL_STATUS_CLAIMED,然后返回 NULL

    –或者–

    如果无法识别未认领的数据,请将 pProtocolStatus 设置为 PROTOCOL_STATUS_NOT_RECOGNIZED,然后返回在 pProtocol 中传递给你的指针。

下面是 RecognizeFrame 的基本实现。

#include <windows.h>

LPBYTE BHAPI MyProtocol_RecognizeFrame( HFRAME hFrame,
                                        LPBYTE        pMacFrame,
                                        LPBYTE        pProtocol,
                                        DWORD         MacType,
                                        DWORD         BytesLeft,
                                        HPROTOCOL     hPrevProtocol,
                                        DWORD         nPreviuosProtOffset,
                                        LPDWORD       pProtocolStatus,
                                        LPHPROTOCOL   phNextProtocol,
                                        LPDWORD       InstData)
  
  // Test unclaimed data. 
  
  // If unclaimed data is recognized, but you do not know what follows.
  *pProtocolStatus =  PROTOCOL_STATUS_RECOGNIZED;
  return pProtocol + MY_PROTOCOL_LENGTH;
  
  // If unclaimed data is recognized and you know what follows.
  *pProtocolStatus =  PROTOCOL_STATUS_NEXT_PROTOCOL;
  phNextProtocol = GetProtocolFromTable(
                                        hTable,
                                        ItemToFind,
                                        lpInstData);
  return  pProtocol + MY_PROTOCOL_LENGTH;
  
  // If unclaimed data is recognized and the protocol is the last 
  // protocol in the frame.
  *pProtocolStatus =  PROTOCOL_STATUS_CLAIMED;
  return NULL;
  
  // If the unclaimed data is not recognized.
  *pProtocolStatus =  PROTOCOL_STATUS_NOT_RECOGNIZED;
  return *pProtocol;

}