Реализация RecognizeFrame

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

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

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

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

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

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

Для реализации RecognizeFrame

  1. Проверьте, что распознаете протокол.

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

    –или–

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

    –или–

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

    –или–

    Если вы не распознаете неиспользуемые данные, задайте для PROTOCOL_STATUS_NOT_RECOGNIZED 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;

}