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