Condividi tramite


Implementazione di RecognizeFrame

Monitoraggi di rete chiama la funzione RecognizeFrame di un parser per determinare che il parser riconosce i dati nonclati di un frame. I dati non reclamati possono trovarsi all'inizio di un frame, ma in genere i dati non reclamati si trovano al centro di un frame. La figura seguente mostra i dati nonclati che si trovano al centro di una cornice.

dati non reclamati che si trovano al centro di un frame

Monitoraggio rete fornisce le informazioni seguenti quando chiama la funzione RecognizeFrame :

  • Handle al frame.
  • Puntatore all'inizio della cornice.
  • Puntatore all'inizio dei dati non reclamati.
  • Valore MAC del primo protocollo nel frame.
  • Numero di byte nei dati non reclamati; ovvero i byte rimanenti nel frame.
  • Handle al protocollo precedente.
  • Offset del protocollo precedente.

Quando la DLL del parser determina che i dati non dichiarati iniziano con il protocollo parser, la DLL del parser determina dove viene avviato il protocollo successivo e il protocollo seguente. Le funzioni DLL del parser nei modi condizionali seguenti:

  • Se la DLL del parser riconosce i dati non dichiarati, la DLL del parser imposta il parametro pProtocolStatus e restituisce un puntatore al protocollo successivo nel frame o NULL. VIENE restituito NULL se il protocollo corrente è l'ultimo protocollo nel frame.
  • Se la DLL del parser riconosce i dati non convalidati e identifica il protocollo che segue (dalle informazioni fornite nel protocollo), la DLL del parser restituisce un puntatore all'handle del protocollo successivo nel parametro phNextProtocol della funzione.
  • Se la DLL del parser non riconosce i dati non annullati, la DLL del parser restituisce il puntatore all'inizio dei dati non annullati e Monitoraggio di rete continua a tentare di analizzare i dati non annullati.

Per implementare RecognizeFrame

  1. Testare per determinare che si riconosce il protocollo.

  2. Se si riconoscono i dati non reclamati e si conosce quale protocollo segue, impostare pProtocolStatus su PROTOCOL_STATUS_NEXT_PROTOCOL, impostare phNextProtocol su un puntatore che punta all'handle per il protocollo successivo e quindi restituire un puntatore al protocollo successivo.

    –oppure–

    Se si riconoscono i dati non annullati e non si conosce quale protocollo segue, impostare pProtocolStatus su PROTOCOL_STATUS_RECOGNIZED e quindi restituire un puntatore al protocollo successivo.

    –oppure–

    Se si riconoscono i dati non reclamati e il protocollo è l'ultimo protocollo in un frame, impostare pProtocolStatus su PROTOCOL_STATUS_CLAIMED e quindi restituire NULL.

    –oppure–

    Se non si riconoscono i dati non definiti, impostare pProtocolStatus su PROTOCOL_STATUS_NOT_RECOGNIZED e quindi restituire il puntatore passato all'utente in pProtocol.

Di seguito è riportata un'implementazione di base di 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;

}