Partager via


Implémentation de RecognizeFrame

Network Monitors appelle la fonction RecognizeFrame d’un analyseur pour déterminer que l’analyseur reconnaît les données non réclamées d’un frame. Les données non réclamées peuvent se trouver au début d’une trame, mais généralement, les données non réclamées se trouvent au milieu d’un cadre. L’illustration suivante montre des données non réclamées situées au milieu d’un cadre.

données non réclamées situées au milieu d’un cadre

Network Monitor fournit les informations suivantes lorsqu’il appelle la fonction RecognizeFrame :

  • Poignée du cadre.
  • Pointeur vers le début du cadre.
  • Pointeur vers le début des données non réclamées.
  • Valeur MAC du premier protocole dans l’image.
  • Nombre d’octets dans les données non réclamées ; autrement dit, les octets restant dans le cadre.
  • Handle du protocole précédent.
  • Décalage du protocole précédent.

Lorsque la DLL de l’analyseur détermine que les données non réclamées commencent par le protocole d’analyseur, la DLL de l’analyseur détermine l’emplacement de démarrage du protocole suivant et le protocole suivant. La DLL de l’analyseur fonctionne de la manière conditionnelle suivante :

  • Si la DLL de l’analyseur reconnaît les données non réclamées, la DLL de l’analyseur définit le paramètre pProtocolStatus et retourne un pointeur vers le protocole suivant dans le cadre ou NULL. La valeur NULL est retournée si le protocole actuel est le dernier protocole de l’image.
  • Si la DLL de l’analyseur reconnaît les données non réclamées et identifie le protocole qui suit (à partir des informations fournies dans le protocole), la DLL de l’analyseur retourne un pointeur vers le handle du protocole suivant dans le paramètre phNextProtocol de la fonction.
  • Si la DLL de l’analyseur ne reconnaît pas les données non réclamées, la DLL de l’analyseur retourne le pointeur vers le début des données non réclamées, et network Monitor continue d’essayer d’analyser les données non réclamées.

Pour implémenter RecognizeFrame

  1. Testez pour déterminer que vous reconnaissez le protocole.

  2. Si vous reconnaissez les données non réclamées et que vous savez quel protocole suit, définissez pProtocolStatus sur PROTOCOL_STATUS_NEXT_PROTOCOL, définissez phNextProtocol sur un pointeur qui pointe vers le handle pour le protocole suivant, puis retournez un pointeur vers le protocole suivant.

    –ou–

    Si vous reconnaissez les données non réclamées et que vous ne savez pas quel protocole suit, définissez pProtocolStatus sur PROTOCOL_STATUS_RECOGNIZED, puis retournez un pointeur vers le protocole suivant.

    –ou–

    Si vous reconnaissez les données non réclamées et que votre protocole est le dernier protocole d’une trame, définissez pProtocolStatus sur PROTOCOL_STATUS_CLAIMED, puis retournez NULL.

    –ou–

    Si vous ne reconnaissez pas les données non réclamées, définissez pProtocolStatus sur PROTOCOL_STATUS_NOT_RECOGNIZED, puis retournez le pointeur qui vous est passé dans pProtocol.

Voici une implémentation de base de 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;

}