다음을 통해 공유


ParserAutoInstallInfo 구현

네트워크 모니터는 ParserAutoInstallInfo 내보내기 함수를 사용하여 파서 설치 ParserAutoInstallInfo가 호출되면 파서는 네트워크 모니터가 파서 DLL을 설치하는 데 필요한 모든 정보를 포함하는 PF_PARSERDLLINFO 구조를 반환합니다.

참고 항목

네트워크 모니터는 Parser.ini 파일에 기존 파서 목록을 유지하고 설치된 각 파서에 대해 별도의 INI 파일을 만듭니다.

 

설치 프로세스 중에 파서 DLL은 다음을 식별해야 합니다.

  • 각 파서의 이름 및 주석 설명을 포함하여 DLL의 파서 수입니다.
  • 파서 프로토콜 앞에 오는 프로토콜입니다.
  • 파서 프로토콜을 따르는 프로토콜입니다.

참고 항목

네트워크 모니터는 이전 및 다음 파서 프로토콜 정보를 사용하여 핸드오프 집합을 업데이트하고 파서 DLL이 식별하는 파서 집합을 따릅니다.

 

다음 절차에서는 ParserAutoInstallInfo를 구현하는 데 필요한 단계를 식별합니다.

ParserAutoInstallInfo를 구현하려면

  1. HeapAlloc를 사용하여 PF_PARSERDLLINFO 구조체할당합니다.
  2. HeapFree를 사용하여 힙에 메모리를 반환합니다.
  3. 이 호출은 DLL의 각 파서에 대한 PF_PARSERINFO 구조도 할당해야 합니다.
  4. DLL이 PF_PARSERDLLINFO nParsers 멤버에 포함하는 파서(일반적으로 1개)를 지정합니다.
  5. PF_PARSERINFO 구조체의 szProtocolName, szComment 및 szHelpFile 멤버에 이름, 주석 및 선택적 도움말 파일을 지정합니다.
  6. 각 DLL 프로토콜 앞에 오는 프로토콜을 지정합니다. 다음 조건 중 하나는 들어오는 핸드오프 집합에 적용됩니다.
    • 이전 프로토콜에서 프로토콜이 이전 프로토콜의 데이터를 따르는지 확인할 수 있는 경우 PF_PARSERINFO pWhoHandsOffToMe 멤버를 설정합니다. 이 경우 프로토콜이 이전 프로토콜의 핸드오프 집합 에 추가됩니다.
    • 이전 프로토콜에서 프로토콜이 이전 프로토콜의 데이터를 따르는지 확인할 수 없는 경우 PF_PARSERINFO pWhoCanPrecedeMe 멤버를 설정합니다. 이 경우 프로토콜이 다음 프로토콜 집합추가됩니다.
  7. 각 DLL 프로토콜을 따르는 프로토콜을 지정합니다. 다음 조건 중 하나는 나가는 후속 집합에 적용됩니다.
    • 프로토콜이 프로토콜의 데이터를 기반으로 수행되는 프로토콜을 결정할 수 있는 경우 PF_PARSERINFO pWhoDoIHandOffTo 멤버를 설정합니다. 이 경우 이러한 프로토콜은 프로토콜의 핸드오프 집합추가됩니다.
    • 프로토콜이 프로토콜의 데이터를 기반으로 수행되는 프로토콜을 확인할 수 없는 경우 PF_PARSERINFO pWhoCanFollowMe 멤버를 설정합니다. 이 경우 이러한 프로토콜은 다음 프로토콜 집합추가됩니다.
  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;

}