实现 RecognizeFrame
网络监视器调用分析程序的 RecognizeFrame 函数,以确定分析程序识别帧的未认领数据。 未认领的数据可能位于帧的开头,但通常,未认领的数据位于帧中间。 下图显示了位于帧中间的未认领数据。
网络监视器在调用 RecognizeFrame 函数时提供以下信息:
- 帧的句柄。
- 指向帧开头的指针。
- 指向未认领数据的开头的指针。
- 帧中第一个协议的 MAC 值。
- 未认领的数据中的字节数;即帧中剩余的字节。
- 上一个协议的句柄。
- 上一个协议的偏移量。
当分析程序 DLL 确定未认领的数据以分析程序协议开头时,分析程序 DLL 将确定下一个协议的开始位置以及遵循的协议。 分析程序 DLL 按以下条件方式运行:
- 如果分析程序 DLL 识别未认领的数据,则分析程序 DLL 将设置 pProtocolStatus 参数,并返回指向帧中下一个协议的指针或 NULL。 如果当前协议是帧中的最后一个协议,则返回 NULL。
- 如果分析程序 DLL 识别未认领的数据,并从协议) 中提供的信息标识 (协议,则分析程序 DLL 将返回指向函数 的 phNextProtocol 参数中下一个协议句柄的指针。
- 如果分析程序 DLL 无法识别未认领的数据,则分析程序 DLL 将返回指向未认领数据的开头的指针,并且网络监视器继续尝试分析未认领的数据。
实现 RecognizeFrame
测试以确定你识别协议。
如果识别未认领的数据并且知道遵循哪个协议,请将 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;
}