Compartilhar via


Implementando RecognizeFrame

Monitores de Rede chama a função RecognizeFrame de um analisador para determinar que o analisador reconhece os dados não reclamados de um quadro. Os dados não reclamados podem estar no início de um quadro, mas, normalmente, os dados não reclamados estão localizados no meio de um quadro. A ilustração a seguir mostra dados não reclamados localizados no meio de um quadro.

Dados não reclamados localizados no meio de um quadro

O Monitor de Rede fornece as seguintes informações quando chama a função RecognizeFrame :

  • Um identificador para o quadro.
  • Um ponteiro para o início do quadro.
  • Um ponteiro para o início dos dados não reclamados.
  • O valor MAC do primeiro protocolo no quadro.
  • O número de bytes nos dados não reclamados; ou seja, os bytes restantes no quadro.
  • Um identificador para o protocolo anterior.
  • O deslocamento do protocolo anterior.

Quando a DLL do analisador determina que os dados não reclamados começam com o protocolo do analisador, a DLL do analisador determina onde o próximo protocolo é iniciado e qual protocolo segue. A DLL do analisador funciona das seguintes maneiras condicionais:

  • Se a DLL do analisador reconhecer dados não reclamados, a DLL do analisador definirá o parâmetro pProtocolStatus e retornará um ponteiro para o próximo protocolo no quadro ou NULL. NULL será retornado se o protocolo atual for o último protocolo no quadro.
  • Se a DLL do analisador reconhecer dados não reclamados e identificar o protocolo a seguir (de informações fornecidas no protocolo), a DLL do analisador retornará um ponteiro para o identificador do próximo protocolo no parâmetro phNextProtocol da função.
  • Se a DLL do analisador não reconhecer dados não reclamados, a DLL do analisador retornará o ponteiro para o início dos dados não reclamados e o Monitor de Rede continuará tentando analisar os dados não reclamados.

Para implementar RecognizeFrame

  1. Teste para determinar se você reconhece o protocolo.

  2. Se você reconhecer dados não reclamados e souber qual protocolo segue, defina pProtocolStatus como PROTOCOL_STATUS_NEXT_PROTOCOL, defina phNextProtocol como um ponteiro que aponta para o identificador do próximo protocolo e retorne um ponteiro para o próximo protocolo.

    –ou–

    Se você reconhecer dados não reclamados e não souber qual protocolo segue, defina pProtocolStatus como PROTOCOL_STATUS_RECOGNIZED e retorne um ponteiro para o próximo protocolo.

    –ou–

    Se você reconhecer dados não reclamados e seu protocolo for o último protocolo em um quadro, defina pProtocolStatus como PROTOCOL_STATUS_CLAIMED e retorne NULL.

    –ou–

    Se você não reconhecer dados não reclamados, defina pProtocolStatus como PROTOCOL_STATUS_NOT_RECOGNIZED e retorne o ponteiro que é passado para você no pProtocol.

Veja a seguir uma implementação básica do 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;

}