次の方法で共有


RecognizeFrame の実装

ネットワーク モニターは、パーサーの RecognizeFrame 関数を呼び出して、パーサーがフレームの未要求データを認識することを決定します。 未請求データはフレームの先頭にある場合がありますが、通常は、未要求のデータはフレームの中央に配置されます。 次の図は、フレームの中央にある未請求のデータを示しています。

フレームの中央にある未請求データ

Network Monitor は、 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;

}