实现 ParserAutoInstallInfo

网络监视器使用 ParserAutoInstallInfo 导出函数安装分析程序。 调用 ParserAutoInstallInfo 时,分析程序将返回一个 PF_PARSERDLLINFO 结构,其中包含网络监视器安装分析程序 DLL 所需的所有信息。

注意

网络监视器会在 Parser.ini 文件中保留一份现有分析程序的列表,并为每个已安装的分析程序创建单独的 INI 文件。

 

在安装过程中,分析程序 DLL 必须标识以下内容:

  • DLL 中的分析程序数,包括每个分析程序的名称和注释说明。
  • 分析程序协议之前的协议。
  • 分析程序协议之后的协议。

注意

网络监视器会使用之前和之后的分析程序协议信息来更新你的分析程序 DLL 所标识的分析程序的移交集跟随集

 

以下过程标识了实现 ParserAutoInstallInfo 所需的步骤。

实现 ParserAutoInstallInfo

  1. 使用 HeapAlloc 分配 PF_PARSERDLLINFO 结构。
  2. 使用 HeapFree 将内存返回到堆。
  3. 请注意,此调用还必须为 DLL 中的每个分析程序分配 PF_PARSERINFO 结构。
  4. 指定 DLL 在 PF_PARSERDLLINFOnParsers 成员中包含的分析程序数(通常为 1 个)。
  5. 在每个 PF_PARSERINFO 结构的 szProtocolNameszCommentszHelpFile 成员中指定名称、注释和可选帮助文件。
  6. 指定每个 DLL 协议之前的协议。 以下条件之一适用于传入的移交集。
    • 如果之前的协议可以确定你的协议跟随之前协议中的数据,请设置 PF_PARSERINFOpWhoHandsOffToMe 成员。 在这种情况下,你的协议将添加到之前协议的移交集
    • 如果之前的协议无法确定你的协议跟随之前协议中的数据,请设置 PF_PARSERINFOpWhoCanPrecedeMe 成员。 在这种情况下,你的协议将添加到协议的跟随集
  7. 指定每个 DLL 协议后面的协议。 以下条件之一适用于传出跟随集。
    • 如果你的协议可以根据你的协议中的数据确定哪些协议跟随,请设置 PF_PARSERINFOpWhoDoIHandOffTo 成员。 在这种情况下,这些协议将添加到你的协议的移交集
    • 如果你的协议无法根据你的协议中的数据确定哪些协议跟随,请设置 PF_PARSERINFOpWhoCanFollowMe 成员。 在这种情况下,这些协议将添加到你的协议的跟随集
  8. PF_PARSERDLLINFO 结构返回到网络监视器。

下面是 ParserAutoInstallInfo 的一个基本实现。 代码示例取自网络监视器提供的泛型分析程序。

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

}