共用方式為


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

}