ParserAutoInstallInfo 구현
네트워크 모니터는 ParserAutoInstallInfo 내보내기 함수를 사용하여 파서 설치 ParserAutoInstallInfo가 호출되면 파서는 네트워크 모니터가 파서 DLL을 설치하는 데 필요한 모든 정보를 포함하는 PF_PARSERDLLINFO 구조를 반환합니다.
참고 항목
네트워크 모니터는 Parser.ini 파일에 기존 파서 목록을 유지하고 설치된 각 파서에 대해 별도의 INI 파일을 만듭니다.
설치 프로세스 중에 파서 DLL은 다음을 식별해야 합니다.
- 각 파서의 이름 및 주석 설명을 포함하여 DLL의 파서 수입니다.
- 파서 프로토콜 앞에 오는 프로토콜입니다.
- 파서 프로토콜을 따르는 프로토콜입니다.
참고 항목
네트워크 모니터는 이전 및 다음 파서 프로토콜 정보를 사용하여 핸드오프 집합을 업데이트하고 파서 DLL이 식별하는 파서 집합을 따릅니다.
다음 절차에서는 ParserAutoInstallInfo를 구현하는 데 필요한 단계를 식별합니다.
ParserAutoInstallInfo를 구현하려면
- HeapAlloc를 사용하여 PF_PARSERDLLINFO 구조체를 할당합니다.
- HeapFree를 사용하여 힙에 메모리를 반환합니다.
- 이 호출은 DLL의 각 파서에 대한 PF_PARSERINFO 구조도 할당해야 합니다.
- DLL이 PF_PARSERDLLINFO nParsers 멤버에 포함하는 파서 수(일반적으로 1개)를 지정합니다.
- 각 PF_PARSERINFO 구조체의 szProtocolName, szComment 및 szHelpFile 멤버에 이름, 주석 및 선택적 도움말 파일을 지정합니다.
- 각 DLL 프로토콜 앞에 오는 프로토콜을 지정합니다. 다음 조건 중 하나는 들어오는 핸드오프 집합에 적용됩니다.
- 각 DLL 프로토콜을 따르는 프로토콜을 지정합니다. 다음 조건 중 하나는 나가는 후속 집합에 적용됩니다.
- 네트워크 모니터에 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;
}