Condividi tramite


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

  1. Allocare una struttura PF_PARedizione Standard RDLLINFO usando HeapAlloc.
  2. Restituire memoria all'heap usando HeapFree.
  3. Tenere presente che questa chiamata deve allocare anche una struttura PF_PARedizione Standard RINFO per ogni parser nella DLL.
  4. Specificare il numero di parser (in genere uno) che la DLL contiene nel membro nParsers di PF_PARedizione Standard RDLLINFO.
  5. Specificare un nome, un commento e un file della Guida facoltativo nei membri szProtocolName, szComment e szHelpFile di ogni struttura PF_PARedizione Standard RINFO.
  6. 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.
  7. 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.
  8. 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;

}