Condividi tramite


Implementazione di RecognizeFrame

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

dati non reclamati che si trovano al centro di un frame

Network Monitor fornisce le seguenti informazioni quando chiama la funzione RecognizeFrame:

  • Maniglia per il telaio.
  • Puntatore all'inizio del frame.
  • Un puntatore all'inizio dei dati non reclamati.
  • Valore MAC del primo protocollo nel frame.
  • La quantità di byte nei dati non reclamati; ovvero, i byte rimanenti nel frame.
  • Riferimento al protocollo precedente.
  • L'offset del protocollo precedente.

Quando la DLL del parser determina che i dati non reclamati iniziano con il protocollo del parser, la DLL del parser determina dove inizia il protocollo successivo e quale protocollo segue. La DLL del parser funziona nei modi condizionali seguenti:

  • Se la DLL del parser riconosce i dati non richiesti, la DLL del parser imposta il parametro pProtocolStatus e restituisce un puntatore al protocollo successivo nel frame oppure NULL. NULL viene restituito se il protocollo corrente è l'ultimo protocollo nel frame.
  • Se la DLL del parser riconosce i dati non reclamati e identifica il protocollo seguente (dalle informazioni fornite nel protocollo), la DLL del parser restituisce un puntatore all'handle del protocollo successivo nel phNextProtocol parametro della funzione.
  • Se il parser DLL non riconosce i dati non reclamati, il parser DLL restituisce il puntatore all'inizio dei dati non reclamati e il monitoraggio di rete continua a tentare di analizzare i dati non reclamati.

Per implementare il RecognizeFrame

  1. Testare per determinare di riconoscere il protocollo.

  2. Se si riconoscono i dati non richiesti e si sa quale protocollo seguire, impostare pProtocolStatus su PROTOCOL_STATUS_NEXT_PROTOCOL, impostare phNextProtocol su un puntatore che indirizza l'handle per il protocollo successivo e quindi restituire un puntatore che indirizza al protocollo successivo.

    –o–

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

    –o–

    Se si riconoscono i dati non richiesti e il protocollo è l'ultimo protocollo nel frame, imposta pProtocolStatus su PROTOCOL_STATUS_CLAIMED e poi restituisci NULL.

    –o–

    Se non si riconoscono dati non richiesti, impostare pProtocolStatus su PROTOCOL_STATUS_NOT_RECOGNIZED e quindi restituire il puntatore che è stato passato a voi 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;

}