實作 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;
}