Implementazione di ParserAutoInstallInfo
Monitoraggio di rete usa la funzione di esportazione ParserAutoInstallInfo per installare un parser. Quando viene chiamato ParserAutoInstallInfo, il parser restituisce una struttura PF_PARedizione Standard RDLLINFO contenente tutte le informazioni necessarie a Monitoraggio di rete per installare una DLL del parser.
Nota
Monitoraggio di rete mantiene un elenco di parser esistenti nel file Parser.ini e crea un file INI separato per ogni parser installato.
Durante il processo di installazione, la DLL del parser deve identificare quanto segue:
- Numero di parser nella DLL, inclusi un nome e una descrizione del commento per ogni parser.
- Protocolli che precedono il protocollo del parser.
- Protocolli che seguono il protocollo del parser.
Nota
Monitoraggio di rete usa le informazioni sul protocollo del parser precedenti e seguenti per aggiornare i set di handoff e seguire i set di parser identificati dalla DLL del parser.
La procedura seguente identifica i passaggi necessari per implementare ParserAutoInstallInfo.
Per implementare ParserAutoInstallInfo
- Allocare una struttura PF_PARedizione Standard RDLLINFO usando HeapAlloc.
- Restituire memoria all'heap usando HeapFree.
- Tenere presente che questa chiamata deve allocare anche una struttura PF_PARedizione Standard RINFO per ogni parser nella DLL.
- Specificare il numero di parser (in genere uno) che la DLL contiene nel membro nParsers di PF_PARedizione Standard RDLLINFO.
- Specificare un nome, un commento e un file della Guida facoltativo nei membri szProtocolName, szComment e szHelpFile di ogni struttura PF_PARedizione Standard RINFO.
- Specificare i protocolli che precedono ogni protocollo DLL. Una delle condizioni seguenti si applica a un set di handoff in ingresso.
- Se i protocolli precedenti possono determinare che il protocollo segue dai dati nei protocolli precedenti, impostare il membro pWhoHandsOffToMe di PF_PARedizione Standard RINFO. In questo caso, il protocollo viene quindi aggiunto ai set di handoff dei protocolli precedenti.
- Se i protocolli precedenti non possono determinare che il protocollo segue dai dati nei protocolli precedenti, impostare pWhoCanPrecedeMe membro di PF_PARedizione Standard RINFO. In questo caso, il protocollo viene quindi aggiunto ai set di protocolli seguenti.
- Specificare i protocolli che seguono ogni protocollo DLL. Una delle condizioni seguenti si applica a un set di follow-set in uscita.
- Se il protocollo può determinare quali protocolli seguono in base ai dati nel protocollo, impostare il membro pWhoDoIHandOffTo di PF_PARedizione Standard RINFO. In questo caso, questi protocolli vengono aggiunti al set di handoff dei protocolli.
- Se il protocollo non è in grado di determinare quali protocolli seguono in base ai dati nel protocollo, impostare il membro pWhoCanFollowMe di PF_PARedizione Standard RINFO. In questo caso, questi protocolli vengono aggiunti al set seguente del protocollo.
- Restituire la struttura PF_PARedizione Standard RDLLINFO a Monitoraggio di rete.
Di seguito è riportata un'implementazione di base di ParserAutoInstallInfo. L'esempio di codice è tratto dal parser generico fornito da Monitoraggio di rete.
#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;
}