ParserAutoInstallInfo の実装
ネットワーク モニターは、ParserAutoInstallInfo エクスポート関数を使ってパーサーをインストールします。 ParserAutoInstallInfo が呼び出されると、パーサーは、ネットワーク モニターがパーサー DLL をインストールするために必要なすべての情報を含む PF_PARSERDLLINFO 構造体を返します。
Note
ネットワーク モニターは、既存のパーサーのリストを Parser.ini ファイルに保持し、インストールされているパーサーごとに個別の INI ファイルを作成します。
インストール プロセス中に、パーサー DLL は以下を識別する必要があります。
- DLL 内のパーサーの数。各パーサーの名前とコメントの説明を含みます。
- パーサー プロトコルに先行するプロトコル。
- パーサー プロトコルに後続するプロトコル。
次の手順では、ParserAutoInstallInfo を実装するために必要な手順を示します。
ParserAutoInstallInfo を実装するには
- HeapAlloc を使って、PF_PARSERDLLINFO 構造体を割り当てます。
- HeapFree を使ってメモリをヒープに返します。
- この呼び出しでは、DLL 内の各パーサーに PF_PARSERINFO 構造体も割り当てる必要があることに注意してください。
- DLL に含まれるパーサーの数 (通常は 1 つ) を、PF_PARSERDLLINFO の nParsers メンバーに指定します。
- 各 PF_PARSERINFO 構造体の szProtocolName、szComment、szHelpFile メンバーに名前、コメント、オプションのヘルプ ファイルを指定します。
- 各 DLL プロトコルの前にあるプロトコルを指定します。 次の条件のいずれかが、受信ハンドオフ セットに適用されます。
- 先行のプロトコルで、使用しているプロトコルが先行するプロトコルのデータに続いていると決定できる場合は、PF_PARSERINFO の pWhoHandsOffToMe メンバーを設定します。 この場合、使用しているプロトコルは先行するプロトコルの "ハンドオフ セット" に追加されます。
- 先行のプロトコルで、使用しているプロトコルが先行するプロトコルのデータに続いていると決定できない場合は、PF_PARSERINFO の pWhoCanPrecedeMe メンバーを設定します。 この場合、使用しているプロトコルはプロトコルの "後続セット" に追加されます。
- 各 DLL プロトコルに続くプロトコルを指定します。 次の条件のいずれかが、送信後続セットに適用されます。
- 使用しているプロトコルで、どのプロトコルが使用しているプロトコル内のデータに基づいて続くかを決定できる場合は、PF_PARSERINFO の pWhoDoIHandOffTo メンバーを設定します。 この場合、これらのプロトコルは使用しているプロトコルの "ハンドオフ セット" に追加されます。
- 使用しているプロトコルで、どのプロトコルが使用しているプロトコル内のデータに基づいて続くかを決定できない場合は、PF_PARSERINFO の pWhoCanFollowMe メンバーを設定します。 この場合、これらのプロトコルは使用しているプロトコルの "後続セット" に追加されます。
- 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;
}