Поделиться через


Реализация RecognizeFrame

Сетевые мониторы вызывают функцию RecognizeFrame средства синтаксического анализа, чтобы определить, что средство синтаксического анализа распознает невостребованные данные кадра. Невостребованные данные могут находиться в начале кадра, но обычно невостребованные данные находятся в середине кадра. На следующем рисунке показаны невостребованные данные, расположенные в середине кадра.

невостребованные данные, расположенные в середине кадра

Монитор сети предоставляет следующие сведения при вызове функции RecognizeFrame :

  • Дескриптор кадра.
  • Указатель на начало кадра.
  • Указатель на начало невостребованных данных.
  • Значение MAC первого протокола в кадре.
  • Количество байтов в невостребованных данных; то есть байты, оставшиеся в кадре.
  • Дескриптор предыдущего протокола.
  • Смещение предыдущего протокола.

Когда библиотека DLL средства синтаксического анализа определяет, что невостребованные данные начинаются с протокола средства синтаксического анализа, библиотека DLL средства синтаксического анализа определяет, где начинается следующий протокол и какой протокол следует за ним. Библиотека DLL средства синтаксического анализа работает следующими условными способами:

  • Если библиотека DLL средства синтаксического анализа распознает невостребованные данные, библиотека DLL средства синтаксического анализа задает параметр pProtocolStatus и возвращает указатель на следующий протокол в кадре или значение NULL. Возвращается значение NULL , если текущий протокол является последним протоколом в кадре.
  • Если библиотека DLL средства синтаксического анализа распознает невостребованные данные и идентифицирует следующий протокол (из сведений, предоставленных в протоколе), то библиотека DLL анализатора возвращает указатель на дескриптор следующего протокола в параметре phNextProtocol функции.
  • Если библиотека DLL средства синтаксического анализа не распознает невостребованные данные, библиотека DLL средства синтаксического анализа возвращает указатель на начало невостребованных данных, а монитор сети продолжает пытаться проанализировать невостребованные данные.

Реализация RecognizeFrame

  1. Протестируйте, чтобы определить, распознаете ли протокол.

  2. Если вы распознаете невостребованные данные и знаете, какой протокол следует, задайте для параметра pProtocolStatus значение PROTOCOL_STATUS_NEXT_PROTOCOL, задайте для phNextProtocol указатель, указывающий на дескриптор для следующего протокола, а затем верните указатель на следующий протокол.

    –или–

    Если вы распознаете невостребованные данные и не знаете, какой протокол следует, задайте для pProtocolStatus значение PROTOCOL_STATUS_RECOGNIZED, а затем верните указатель на следующий протокол.

    –или–

    Если вы распознаете невостребованные данные и ваш протокол является последним протоколом в кадре, задайте для параметра pProtocolStatus значение PROTOCOL_STATUS_CLAIMED, а затем верните значение NULL.

    –или–

    Если не распознаются невостребованные данные, задайте для pProtocolStatus значение PROTOCOL_STATUS_NOT_RECOGNIZED, а затем верните указатель, передаваемый в pProtocol.

Ниже приведена базовая реализация 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;

}