Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сетевые мониторы вызывают функцию RecognizeFrame парсера, чтобы определить, распознаёт ли парсер незадействованные данные кадра. Неиспользованные данные могут находиться в начале кадра, но обычно неиспользованные данные находятся в середине кадра. На следующем рисунке показаны неиспользованные данные, расположенные в центре кадра.
Сетевой монитор предоставляет следующие сведения при вызове функции RecognizeFrame:
- Дескриптор кадра.
- Указатель на начало кадра.
- Указатель на начало незапрошенных данных.
- Значение MAC первого протокола в кадре.
- Количество байтов в неподтвержденных данных; то есть байты, остающиеся в кадре.
- Дескриптор предыдущего протокола.
- Смещение предыдущего протокола.
Когда библиотека DLL синтаксического анализа определяет, что непроданные данные начинаются с протокола синтаксического анализа, она определяет, где начинается следующий протокол и какой протокол следует за ним. Функции DLL синтаксического анализа работают в зависимости от следующих условий:
- Если DLL синтаксического анализа распознает необработанные данные, она устанавливает параметр pProtocolStatus и возвращает указатель на следующий протокол в кадре или NULL. NULL возвращается, если текущий протокол является последним протоколом в фрейме.
- Если библиотека DLL синтаксического анализа распознает неисключенные данные и определяет протокол, который следует (из сведений, предоставленных в протоколе), библиотека DLL синтаксического анализа возвращает указатель на дескриптор следующего протокола в phNextProtocol параметр функции.
- Если DLL синтаксического анализа не распознает незахваченные данные, она возвращает указатель на начало этих данных, и сетевой монитор продолжает их анализировать.
Для реализации RecognizeFrame
Проверьте, что распознаете протокол.
Если вы распознаете неиспользуемые данные и знаете, какой протокол следует, задайте для 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;
}