Implementieren von ParserAutoInstallInfo
Der Netzwerkmonitor verwendet die Exportfunktion ParserAutoInstallInfo, um einen Parser zu installieren. Wenn ParserAutoInstallInfo aufgerufen wird, gibt der Parser eine PF\_PARSERDLLINFO-Struktur zurück, die alle Informationen enthält, die der Netzwerkmonitor zum Installieren einer Parser-DLL benötigt.
Hinweis
Der Netzwerkmonitor behält eine Liste vorhandener Parser in der Datei Parser.ini bei und erstellt für jeden installierten Parser eine separate INI-Datei.
Während des Installationsvorgangs muss die Parser-DLL Folgendes identifizieren:
- Die Anzahl der Parser in der DLL, einschließlich eines Namens und einer Kommentarbeschreibung für jeden Parser.
- Die Protokolle, die dem Parserprotokoll vorausgehen.
- Die Protokolle, die dem Parserprotokoll folgen.
Hinweis
Der Netzwerkmonitor verwendet die vorausgehenden und folgenden Parserprotokollinformationen, um die Handoffsätze und Folgesätze von Parsern zu aktualisieren, die von der Parser-DLL identifiziert werden.
Im folgenden Verfahren werden die Schritte identifiziert, die zum Implementieren von ParserAutoInstallInfo erforderlich sind.
So implementieren Sie ParserAutoInstallInfo
- Weisen Sie eine PF_PARSERDLLINFO-Struktur mithilfe von HeapAlloc zu.
- Geben Sie den Speicher mithilfe von HeapFree an den Heap zurück.
- Beachten Sie, dass dieser Aufruf auch eine PF_PARSERINFO-Struktur für jeden Parser in der DLL zuweisen muss.
- Geben Sie die Anzahl der Parser (in der Regel eine) an, die die DLL im nParsers-Element von PF_PARSERDLLINFO enthält.
- Geben Sie einen Namen, einen Kommentar und eine optionale Hilfedatei in den Elementen szProtocolName, szComment und szHelpFile jeder PF_PARSERINFO-Struktur an.
- Geben Sie die Protokolle an, die jedem DLL-Protokoll vorausgehen. Eine der folgenden Bedingungen gilt für einen eingehenden Handoffsatz.
- Wenn die vorausgehenden Protokolle bestimmen können, dass Ihr Protokoll aus Daten in den vorausgehenden Protokollen folgt, legen Sie das pWhoHandsOffToMe-Element von PF_PARSERINFO fest. In diesem Fall wird Ihr Protokoll dann den Handoffsätzen der vorausgehenden Protokolle hinzugefügt.
- Wenn die vorausgehenden Protokolle nicht bestimmen können, dass Ihr Protokoll aus Daten in den vorausgehenden Protokollen folgt, legen Sie das pWhoCanPrecedeMe-Element von PF_PARSERINFO fest. In diesem Fall wird das Protokoll dann den nachfolgenden Sätzen der Protokolle hinzugefügt.
- Geben Sie die Protokolle an, die jedem DLL-Protokoll nachfolgen. Eine der folgenden Bedingungen gilt für einen ausgehenden Folgesatz.
- Wenn Ihr Protokoll anhand der Daten in Ihrem Protokoll bestimmen kann, welche Protokolle nachfolgen, legen Sie das pWhoDoIHandOffTo-Element von PF_PARSERINFO fest. In diesem Fall werden diese Protokolle dem Handoffsatz Ihrer Protokolle hinzugefügt.
- Wenn Ihr Protokoll anhand der Daten in Ihrem Protokoll nicht bestimmen kann, welche Protokolle nachfolgen, legen Sie das pWhoCanFollowMe-Element von PF_PARSERINFO fest. In diesem Fall werden diese Protokolle dem Folgesatz Ihrer Protokolle hinzugefügt.
- Geben Sie die PF_PARSERDLLINFO-Struktur an den Netzwerkmonitor zurück.
Im Folgenden finden Sie eine grundlegende Implementierung von ParserAutoInstallInfo. Das Codebeispiel stammt aus dem generischen Parser, den der Netzwerkmonitor bereitstellt.
#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;
}