Реализация ParserAutoInstallInfo
Сетевой монитор использует функцию экспорта ParserAutoInstallInfo для установки средства синтаксического анализа. При вызове ParserAutoInstallInfo средство синтаксического анализа возвращает PF_PARSERDLLINFO структуру, содержащую все сведения, необходимые сетевому монитору для установки библиотеки DLL синтаксического анализа.
Примечание.
Сетевой монитор хранит список существующих синтаксического анализа в файле Parser.ini и создает отдельный INI-файл для каждого установленного синтаксического анализа.
Во время установки библиотека DLL синтаксического анализа должна определить следующее:
- Количество синтаксического анализа в библиотеке DLL, включая имя и описание комментариев для каждого средства синтаксического анализа.
- Протоколы, предшествующие протоколу синтаксического анализа.
- Протоколы, следовать протоколу синтаксического анализа.
Примечание.
Сетевой монитор использует предыдущие и следующие сведения о протоколе синтаксического анализа для обновления наборов раздаток и выполнения наборов синтаксического анализа, которые идентифицирует библиотека DLL средства синтаксического анализа.
Следующая процедура определяет шаги, необходимые для реализации ParserAutoInstallInfo.
Реализация ParserAutoInstallInfo
- Выделите структуру PF_PARSERDLLINFO с помощью HeapAlloc.
- Верните память в кучу с помощью HeapFree.
- Помните, что этот вызов также должен выделять PF_PARSERINFO структуру для каждого средства синтаксического анализа в библиотеке DLL.
- Укажите количество синтаксического анализа (как правило, один) библиотеки DLL, содержащейся в элементе nParsers PF_PARSERDLLINFO.
- Укажите имя, комментарий и необязательный файл справки в файлах szProtocolName, szComment и szHelpFile для каждой структуры PF_PARSERINFO .
- Укажите протоколы, предшествующие каждому протоколу DLL. Одно из следующих условий относится к входящего набора передачи.
- Если предыдущие протоколы могут определить, что протокол следует из данных в предыдущих протоколах, задайте элемент p Кто HandsOffToMe PF_PARSERINFO. В этом случае протокол добавляется в наборы раздаток предыдущих протоколов.
- Если предыдущие протоколы не могут определить, что протокол следует из данных в предыдущих протоколах, задайте для элемента PF_PARSERINFO p Кто CanPrecedeMe. В этом случае протокол добавляется в следующие наборы протоколов.
- Укажите протоколы, следовать каждому протоколу DLL. Одно из следующих условий относится к исходящему набору.
- Если протокол может определить, какие протоколы следуют на основе данных в протоколе, задайте элемент p Кто DoIHandOffTo PF_PARSERINFO. В этом случае эти протоколы добавляются в набор протоколов передачи.
- Если протокол не может определить, какие протоколы следуют на основе данных в протоколе, задайте элемент p Кто CanFollowMe PF_PARSERINFO. В этом случае эти протоколы добавляются в следующий набор протокола.
- Верните структуру PF_PARSERDLLINFO в сетевой монитор.
Ниже приведена базовая реализация ParserAutoInstallInfo. Пример кода взят из универсального средства синтаксического анализа, который предоставляет сетевой монитор.
#include <windows.h>
PPF_PARSERDLLINFO WINAPI ParserAutoInstallInfo()
{
/////////////////////////////////////////////////////////////////
//
// Allocate memory for PF_PARSERDLLINFO structure.
//
/////////////////////////////////////////////////////////////////
PPF_PARSERDLLINFO pParserDllInfo;
PPF_PARSERINFO pParserInfo;
DWORD NumProtocols;
DWORD NumParsers;
DWORD NumFollows;
NumParsers = 1;
pParserDllInfo = (PPF_PARSERDLLINFO)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof( PF_PARSERDLLINFO ) +
NumParsers * sizeof( PF_PARSERINFO) );
if( pParserDllInfo == NULL)
{
return NULL;
}
/////////////////////////////////////////////////////////////////
//
// Specify the number of parsers in the DLL.
//
/////////////////////////////////////////////////////////////////
pParserDllInfo->nParsers = NumParsers;
/////////////////////////////////////////////////////////////////
//
// Specify the name, comment, and Help file for each protocol.
//
/////////////////////////////////////////////////////////////////
pParserInfo = &(pParserDllInfo->ParserInfo[0]);
sprintf_s( pParserInfo->szProtocolName, MAX_PROTOCOL_NAME_LEN,
"TestProtocol" );
sprintf_s( pParserInfo->szComment, MAX_PROTOCOL_COMMENT_LEN,
"Test protocol for SDK" );
sprintf_s( pParserInfo->szHelpFile, MAX_PATH, "");
/////////////////////////////////////////////////////////////////
//
// Specify preceding protocols.
//
/////////////////////////////////////////////////////////////////
PPF_HANDOFFSET pHandoffSet;
PPF_HANDOFFENTRY pHandoffEntry;
// Allocate PF_HANDOFFSET structure.
NumHandoffs = 1;
pHandoffSet = (PPF_HANDOFFSET)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof( PF_HANDOFFSET ) +
NumHandoffs * sizeof( PF_HANDOFFENTRY) );
if( pHandoffSet == NULL )
{
return pParserDllInfo;
}
// Fill in handoff set
pParserInfo->pWhoHandsOffToMe = pHandoffSet;
pHandoffSet->nEntries = NumHandoffs;
// TCP PORT FFFF
pHandoffEntry = &(pHandoffSet->Entry[0]);
sprintf_s( pHandoffEntry->szIniFile, MAX_PATH, "TCPIP.INI" );
sprintf_s( pHandoffEntry->szIniSection, MAX_PATH, "TCP_HandoffSet" );
sprintf_s( pHandoffEntry->szProtocol, MAX_PROTOCOL_NAME_LEN,
"BLRPLATE" );
pHandoffEntry->dwHandOffValue = 0xFFFF;
pHandoffEntry->ValueFormatBase = HANDOFF_VALUE_FORMAT_BASE_DECIMAL;
/////////////////////////////////////////////////////////////////
//
// Specify the following protocols.
//
/////////////////////////////////////////////////////////////////
PPF_FOLLOWSET pFollowSet;
PPF_FOLLOWENTRY pFollowEntry;
// Allocate PF_FOLLOWSET structure
NumFollows = 1;
pFollowSet = (PPF_FOLLOWSET)HeapAlloc( GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof( PF_FOLLOWSET ) +
NumFollows * sizeof( PF_FOLLOWENTRY) );
if( pFollowSet == NULL )
{
return pParserDllInfo;
}
// Fill in the follow set
pParserInfo->pWhoCanFollowMe = pFollowSet;
pFollowSet->nEntries = NumFollows;
// Add SMB
pFollowEntry = &(pFollowSet->Entry[0]);
sprintf_s( pFollowEntry->szProtocol, MAX_PROTOCOL_NAME_LEN, "SMB" );
/////////////////////////////////////////////////////////////////
//
// Return the PF_PARSERDLLINFO structure.
//
/////////////////////////////////////////////////////////////////
return pParserDllInfo;
}