Partilhar via


Implementando ParserAutoInstallInfo

O Monitor de Rede usa a função de exportação ParserAutoInstallInfo para instalar um analisador. Quando ParserAutoInstallInfo é chamado, o analisador retorna uma estrutura PF_PARSERDLLINFO que contém todas as informações que o Monitor de Rede precisa para instalar uma DLL do analisador.

Observação

O Monitor de Rede mantém uma lista de analisadores existentes no arquivo Parser.ini e cria um arquivo INI separado para cada analisador instalado.

 

Durante o processo de instalação, a DLL do analisador deve identificar o seguinte:

  • O número de analisadores na DLL, incluindo um nome e uma descrição de comentário para cada analisador.
  • Os protocolos que precedem o protocolo do analisador.
  • Os protocolos que seguem o protocolo do analisador.

Observação

O Monitor de Rede usa as informações de protocolo do analisador anteriores e a seguir para atualizar os conjuntos de entrega e seguir conjuntos de analisadores identificados pela DLL do analisador.

 

O procedimento a seguir identifica as etapas necessárias para implementar ParserAutoInstallInfo.

Para implementar ParserAutoInstallInfo

  1. Aloque uma estrutura PF_PARSERDLLINFO usando HeapAlloc.
  2. Retornar memória para o heap usando HeapFree.
  3. Lembre-se de que essa chamada também deve alocar uma estrutura PF_PARSERINFO para cada analisador na DLL.
  4. Especifique o número de analisadores (normalmente um) que a DLL contém no membro nParsers de PF_PARSERDLLINFO.
  5. Especifique um nome, um comentário e um arquivo de Ajuda opcional nos membros szProtocolName, szCommente szHelpFile de cada estrutura PF_PARSERINFO.
  6. Especifique os protocolos que precedem cada protocolo DLL. Uma das condições a seguir se aplica a um conjunto de entrega de entrada.
    • Se os protocolos anteriores puderem determinar que o protocolo segue os dados nos protocolos anteriores, defina o membro pWhoHandsOffToMe de PF_PARSERINFO. Nesse caso, o protocolo é adicionado aos conjuntos de entrega dos protocolos anteriores.
    • Se os protocolos anteriores não puderem determinar que o protocolo segue os dados nos protocolos anteriores, defina o membro pWhoCanPrecedeMe de PF_PARSERINFO. Nesse caso, o protocolo é adicionado aos seguintes conjuntos de protocolos.
  7. Especifique os protocolos que seguem cada protocolo DLL. Uma das condições a seguir se aplica a um conjunto de seguimento de saída.
    • Se o protocolo puder determinar quais protocolos seguem com base nos dados em seu protocolo, defina o membro pWhoDoIHandOffTo de PF_PARSERINFO. Nesse caso, esses protocolos são adicionados ao conjunto de entrega de seus protocolos.
    • Se o protocolo não puder determinar quais protocolos seguem com base nos dados em seu protocolo, defina o membro pWhoCanFollowMe de PF_PARSERINFO. Nesse caso, esses protocolos são adicionados ao seguinte conjunto de protocolos.
  8. Retorne a estrutura de PF_PARSERDLLINFO ao Monitor de Rede.

Veja a seguir uma implementação básica de ParserAutoInstallInfo. O exemplo de código é obtido do analisador genérico que o Monitor de Rede fornece.

#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;

}