實作 ParserAutoInstallInfo
網路監視器會使用 ParserAutoInstallInfo 匯出函式來安裝剖析器。 呼叫 ParserAutoInstallInfo 時 ,剖析器會 傳回PF_PARSERDLLINFO 結構,其中包含網路監視器安裝剖析器 DLL 所需的所有 資訊。
注意
網路監視器會保留 Parser.ini 檔案中 現有的剖析器清單,並為每個已安裝的剖析器建立個別的 INI 檔案。
在安裝程式期間,剖析器 DLL 必須識別下列專案:
- DLL 中的剖析器數目,包括每個剖析器的名稱和批註描述。
- 剖析器通訊協定前面的通訊協定。
- 遵循剖析器通訊協定的通訊協定。
注意
網路監視器會使用上述和下列剖析器通訊協定資訊來更新 交接集 ,並 遵循剖析器 DLL 所識別的剖析器集合 。
下列程式會識別實 作 ParserAutoInstallInfo 所需的步驟。
實作 ParserAutoInstallInfo
- 使用 HeapAlloc 配置 PF_PARSERDLLINFO 結構。
- 使用 HeapFree 將記憶體傳回堆積。
- 請注意,此呼叫也必須為 DLL 中的每個剖析器配置 PF_PARSERINFO 結構。
- 指定 dll 包含在 nParsers 成員 中PF_PARSERDLLINFO 的剖析器數目(通常是一個)。
- 在 szProtocolName 、szComment 和 szHelpFile 成員中,指定每個 PF_PARSERINFO 結構的名稱、批註和 選擇性說明檔 。
- 指定每個 DLL 通訊協定前面的通訊協定。 下列其中一個條件適用于傳入的遞交集。
- 如果上述通訊協定可以判斷您的通訊協定是否遵循上述通訊協定中的資料,請設定 PF_PARSERINFO 的 p神秘HandsOffToMe 成員。 在此情況下,您的通訊協定接著會新增至 上述通訊協定的交接集 。
- 如果上述通訊協定無法判斷您的通訊協定遵循上述通訊協定中的資料,請設定 p神秘CanPrecedeMe 成員 PF_PARSERINFO 。 在此情況下,您的通訊協定接著會新增至 下列通訊協定集 。
- 指定每個 DLL 通訊協定之後的通訊協定。 下列其中一個條件適用于傳出追蹤集。
- 如果您的通訊協定可以根據通訊協定中的資料來判斷哪些通訊協定,請設定 PF_PARSERINFO 的 p神秘DoIHandOffTo 成員。 在此情況下,這些通訊協定會新增至 通訊協定的交接集 。
- 如果您的通訊協定無法根據通訊協定中的資料來判斷所遵循的通訊協定,請設定 PF_PARSERINFO 的 p神秘CanFollowMe 成員。 在此情況下,這些通訊協定會新增至 您通訊協定的下列集合 。
- 將 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;
}