Implementar ParserAutoInstallInfo
El Monitor de red usa la función de exportación ParserAutoInstallInfo para instalar un analizador. Cuando se llama a ParserAutoInstallInfo, el analizador devuelve una estructura PF_PARSERDLLINFO que contiene toda la información que el Monitor de red necesita para instalar una DLL del analizador.
Nota:
El Monitor de red mantiene una lista de analizadores existentes en el archivo Parser.ini y crea un archivo INI independiente para cada analizador instalado.
Durante el proceso de instalación, la DLL del analizador debe identificar lo siguiente:
- Número de analizadores en la DLL, incluido un nombre y una descripción de comentario para cada analizador.
- Protocolos que preceden al protocolo del analizador.
- Protocolos que siguen al protocolo del analizador.
Nota:
El Monitor de red usa la información del protocolo del analizador anterior y siguiente para actualizar los conjuntos de entrega y seguir conjuntos de analizadores que identifica la DLL del analizador.
El siguiente procedimiento identifica los pasos necesarios para implementar ParserAutoInstallInfo.
Para implementar ParserAutoInstallInfo
- Asigne una estructura PF_PARSERDLLINFO mediante HeapAlloc.
- Devolver memoria al montón mediante HeapFree.
- Tenga en cuenta que esta llamada también debe asignar una estructura PF_PARSERINFO para cada analizador de la DLL.
- Especifique el número de analizadores (normalmente uno) que contiene la DLL en el miembro nParsers de PF_PARSERDLLINFO.
- Especifique un nombre, comentario y un archivo de Ayuda opcional en los miembros szProtocolName, szComment y szHelpFile de cada estructura de PF_PARSERINFO.
- Especifique los protocolos que preceden a cada protocolo DLL. Una de las siguientes condiciones se aplica a un conjunto de entrega entrante.
- Si los protocolos anteriores pueden determinar que el protocolo sigue a los datos de los protocolos anteriores, establezca el miembro pWhoHandsOffToMe de PF_PARSERINFO. En este caso, el protocolo se agrega a los conjuntos de entrega de los protocolos anteriores.
- Si los protocolos anteriores no pueden determinar que el protocolo sigue a los datos de los protocolos anteriores, establezca el miembro pWhoCanPrecedeMe de PF_PARSERINFO. En este caso, el protocolo se agrega a los siguientes conjuntos de protocolos.
- Especifique los protocolos que siguen a cada protocolo DLL. Una de las condiciones siguientes se aplica a un conjunto de seguimiento saliente.
- Si el protocolo no puede determinar qué protocolos siguen en función de los datos del protocolo, establezca el miembro pWhoDoIHandOffTo de PF_PARSERINFO. En este caso, estos protocolos se agregan al conjunto de entrega de los protocolos.
- Si el protocolo no puede determinar qué protocolos siguen en función de los datos del protocolo, establezca el miembro pWhoCanFollowMe de PF_PARSERINFO. En este caso, estos protocolos se agregan al siguiente conjunto de protocolos.
- Devuelve la estructura PF_PARSERDLLINFO a Monitor de red.
A continuación se muestra una implementación básica de ParserAutoInstallInfo. El ejemplo de código se toma del analizador genérico que proporciona Monitor de red.
#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;
}