Freigeben über


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

  1. Weisen Sie eine PF_PARSERDLLINFO-Struktur mithilfe von HeapAlloc zu.
  2. Geben Sie den Speicher mithilfe von HeapFree an den Heap zurück.
  3. Beachten Sie, dass dieser Aufruf auch eine PF_PARSERINFO-Struktur für jeden Parser in der DLL zuweisen muss.
  4. Geben Sie die Anzahl der Parser (in der Regel eine) an, die die DLL im nParsers-Element von PF_PARSERDLLINFO enthält.
  5. Geben Sie einen Namen, einen Kommentar und eine optionale Hilfedatei in den Elementen szProtocolName, szComment und szHelpFile jeder PF_PARSERINFO-Struktur an.
  6. 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.
  7. 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.
  8. 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;

}