Freigeben über


Implementieren von RecognizeFrame

Netzwerkmonitore rufen die RecognizeFrame-Funktion eines Parsers auf, um festzustellen, dass der Parser die nicht beanspruchten Daten eines Frames erkennt. Die nicht beanspruchten Daten befinden sich möglicherweise am Anfang eines Frames, aber normalerweise befinden sich nicht beanspruchte Daten in der Mitte eines Frames. Die folgende Abbildung zeigt nicht beanspruchte Daten, die sich in der Mitte eines Frames befinden.

Nicht beanspruchte Daten in der Mitte eines Frames

Network Monitor stellt die folgenden Informationen bereit, wenn die RecognizeFrame-Funktion aufgerufen wird:

  • Ein Handle für den Frame.
  • Ein Zeiger auf den Anfang des Frames.
  • Ein Zeiger auf den Anfang der nicht beanspruchten Daten.
  • Der MAC-Wert des ersten Protokolls im Frame.
  • Die Anzahl der Bytes in den nicht beanspruchten Daten; d. h. die bytes, die im Frame verbleiben.
  • Ein Handle zum vorherigen Protokoll.
  • Der Offset des vorherigen Protokolls.

Wenn die Parser-DLL feststellt, dass nicht beanspruchte Daten mit dem Parserprotokoll beginnen, bestimmt die Parser-DLL, wo das nächste Protokoll beginnt und welches Protokoll folgt. Die Parser-DLL funktioniert auf folgende bedingte Weise:

  • Wenn die Parser-DLL nicht beanspruchte Daten erkennt, legt die Parser-DLL den pProtocolStatus-Parameter fest und gibt einen Zeiger auf das nächste Protokoll im Frame oder NULL zurück. NULL wird zurückgegeben, wenn das aktuelle Protokoll das letzte Protokoll im Frame ist.
  • Wenn die Parser-DLL nicht beanspruchte Daten erkennt und das folgende Protokoll identifiziert (aus den im Protokoll bereitgestellten Informationen), gibt die Parser-DLL einen Zeiger auf das Handle des nächsten Protokolls im phNextProtocol-Parameter der Funktion zurück.
  • Wenn die Parser-DLL nicht beanspruchte Daten nicht erkennt, gibt die Parser-DLL den Zeiger auf den Anfang der nicht beanspruchten Daten zurück, und Der Netzwerkmonitor versucht weiterhin, die nicht beanspruchten Daten zu analysieren.

So implementieren Sie RecognizeFrame

  1. Testen Sie, um festzustellen, ob Sie das Protokoll erkennen.

  2. Wenn Sie nicht beanspruchte Daten erkennen und wissen, welches Protokoll folgt, legen Sie pProtocolStatus auf PROTOCOL_STATUS_NEXT_PROTOCOL fest, legen Sie phNextProtocol auf einen Zeiger fest, der auf das Handle für das nächste Protokoll verweist, und geben Sie dann einen Zeiger auf das nächste Protokoll zurück.

    – oder –

    Wenn Sie nicht beanspruchte Daten erkennen und nicht wissen, welches Protokoll folgt, legen Sie pProtocolStatus auf PROTOCOL_STATUS_RECOGNIZED fest, und geben Sie dann einen Zeiger auf das nächste Protokoll zurück.

    – oder –

    Wenn Sie nicht beanspruchte Daten erkennen und Ihr Protokoll das letzte Protokoll in einem Frame ist, legen Sie pProtocolStatus auf PROTOCOL_STATUS_CLAIMED fest, und geben Sie dann NULL zurück.

    – oder –

    Wenn Sie nicht beanspruchte Daten nicht erkennen, legen Sie pProtocolStatus auf PROTOCOL_STATUS_NOT_RECOGNIZED fest, und geben Sie dann den Zeiger zurück, der in pProtocol an Sie übergeben wird.

Es folgt eine grundlegende Implementierung von 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;

}