次の方法で共有


ParserAutoInstallInfo の実装

ネットワーク モニターは、ParserAutoInstallInfo エクスポート関数を使ってパーサーをインストールします。 ParserAutoInstallInfo が呼び出されると、パーサーは、ネットワーク モニターがパーサー DLL をインストールするために必要なすべての情報を含む PF_PARSERDLLINFO 構造体を返します。

Note

ネットワーク モニターは、既存のパーサーのリストを Parser.ini ファイルに保持し、インストールされているパーサーごとに個別の INI ファイルを作成します。

 

インストール プロセス中に、パーサー DLL は以下を識別する必要があります。

  • DLL 内のパーサーの数。各パーサーの名前とコメントの説明を含みます。
  • パーサー プロトコルに先行するプロトコル。
  • パーサー プロトコルに後続するプロトコル。

Note

ネットワーク モニターは、前後のパーサー プロトコル情報を使って、パーサー DLL が識別するパーサーの "ハンドオフ セット" と "後続セット" を更新します。

 

次の手順では、ParserAutoInstallInfo を実装するために必要な手順を示します。

ParserAutoInstallInfo を実装するには

  1. HeapAlloc を使って、PF_PARSERDLLINFO 構造体を割り当てます。
  2. HeapFree を使ってメモリをヒープに返します。
  3. この呼び出しでは、DLL 内の各パーサーに PF_PARSERINFO 構造体も割り当てる必要があることに注意してください。
  4. DLL に含まれるパーサーの数 (通常は 1 つ) を、PF_PARSERDLLINFOnParsers メンバーに指定します。
  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;

}