Implementando ParserAutoInstallInfo
O Monitor de Rede usa a função de exportação ParserAutoInstallInfo para instalar um analisador. Quando ParserAutoInstallInfo é chamado, o analisador retorna uma estrutura PF_PARSERDLLINFO que contém todas as informações que o Monitor de Rede precisa para instalar uma DLL do analisador.
Observação
O Monitor de Rede mantém uma lista de analisadores existentes no arquivo Parser.ini e cria um arquivo INI separado para cada analisador instalado.
Durante o processo de instalação, a DLL do analisador deve identificar o seguinte:
- O número de analisadores na DLL, incluindo um nome e uma descrição de comentário para cada analisador.
- Os protocolos que precedem o protocolo do analisador.
- Os protocolos que seguem o protocolo do analisador.
Observação
O Monitor de Rede usa as informações de protocolo do analisador anteriores e a seguir para atualizar os conjuntos de entrega e seguir conjuntos de analisadores identificados pela DLL do analisador.
O procedimento a seguir identifica as etapas necessárias para implementar ParserAutoInstallInfo.
Para implementar ParserAutoInstallInfo
- Aloque uma estrutura PF_PARSERDLLINFO usando HeapAlloc.
- Retornar memória para o heap usando HeapFree.
- Lembre-se de que essa chamada também deve alocar uma estrutura PF_PARSERINFO para cada analisador na DLL.
- Especifique o número de analisadores (normalmente um) que a DLL contém no membro nParsers de PF_PARSERDLLINFO.
- Especifique um nome, um comentário e um arquivo de Ajuda opcional nos membros szProtocolName, szCommente szHelpFile de cada estrutura PF_PARSERINFO.
- Especifique os protocolos que precedem cada protocolo DLL. Uma das condições a seguir se aplica a um conjunto de entrega de entrada.
- Se os protocolos anteriores puderem determinar que o protocolo segue os dados nos protocolos anteriores, defina o membro pWhoHandsOffToMe de PF_PARSERINFO. Nesse caso, o protocolo é adicionado aos conjuntos de entrega dos protocolos anteriores.
- Se os protocolos anteriores não puderem determinar que o protocolo segue os dados nos protocolos anteriores, defina o membro pWhoCanPrecedeMe de PF_PARSERINFO. Nesse caso, o protocolo é adicionado aos seguintes conjuntos de protocolos.
- Especifique os protocolos que seguem cada protocolo DLL. Uma das condições a seguir se aplica a um conjunto de seguimento de saída.
- Se o protocolo puder determinar quais protocolos seguem com base nos dados em seu protocolo, defina o membro pWhoDoIHandOffTo de PF_PARSERINFO. Nesse caso, esses protocolos são adicionados ao conjunto de entrega de seus protocolos.
- Se o protocolo não puder determinar quais protocolos seguem com base nos dados em seu protocolo, defina o membro pWhoCanFollowMe de PF_PARSERINFO. Nesse caso, esses protocolos são adicionados ao seguinte conjunto de protocolos.
- Retorne a estrutura de PF_PARSERDLLINFO ao Monitor de Rede.
Veja a seguir uma implementação básica de ParserAutoInstallInfo. O exemplo de código é obtido do analisador genérico que o Monitor de Rede fornece.
#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;
}