다음을 통해 공유


DllMain 파서 구현

네트워크 모니터는 DllMain 내보내기 함수를 사용하여 파서의 존재를 식별하고 네트워크 모니터가 파서에 대한 정보를 저장하는 데 사용하는 리소스를 해제합니다.

네트워크 모니터가 DllMain 을 처음 호출하는 경우 파서 DLL은 CreateProtocol 을 호출하여 다음을 수행합니다.

  • 파서가 검색하는 프로토콜을 지정합니다.
  • 네트워크 모니터에서 호출하는 나머지 파서 내보내기 함수에 대한 진입점을 제공합니다.

네트워크 모니터가 마지막으로 DllMain 을 호출하면 DllMainDestroyProtocol 을 호출하여 네트워크 모니터가 파서에 대한 정보를 저장하는 데 사용하는 모든 리소스를 해제합니다.

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

DllMain을 구현하려면

  1. CreateProtocol 함수 및 전역 Attach 변수에 대한 ENTRYPOINTS 구조를 지정합니다. Attach 변수는 실행 중인 프로토콜 인스턴스 수를 추적하는 데 사용됩니다.

  2. 운영 체제에서 설정하는 Command 매개 변수의 값을 확인합니다.

    Command 매개 변수가 DLL_PROCESS_ATTACH 및 Attach가 0인 경우 CreateProtocol을 호출하여 다음 내보내기 함수에 대한 프로토콜 이름과 진입점을 제공합니다.

    • 등록
    • 등록 취소
    • RecognizeFrame
    • AttachProperties
    • FormatProperties (네트워크 모니터가 프로토콜 속성을 표시하는 경우에만 필요).

    Command 매개 변수가 DLL_PROCESS_DETACH 설정되고 Attach가 0이면 CreateProtocol이 반환하는 instance 핸들을 사용하여 DestroyProtocol을 호출합니다.

  3. DllMain 파서 함수는 항상 TRUE를 반환해야 하므로 TRUE를 반환합니다.

다음은 DllMain의 기본 구현입니다. 코드 예제에서는 case 문을 사용하여 Command 매개 변수의 값을 트래핑하여 CreateProtocol 또는 DestroyProtocol 을 호출해야 하는지 확인합니다.

#include <windows.h>

// Entry point structure for parser export functions and global
// Attach variable.
ENTRYPOINTS EntryPoints =
{
  Register,
  Deregister,
  RecognizeFrame,
  AttachProperties,
  FormatProperties
};

DWORD Attached = 0; 

BOOL WINAPI DllMain(HANDLE hInstance, ULONG Command, LPVOID Reserved)
{
  switch(Command)
  {
  // Call CreateProtocol.
  case DLL_PROCESS_ATTACH:
       // Loading parser DLL.
       if(Attached == 0)
       {
         hProtocol = CreateProtocol( "ProtocolName",
                                     &EntryPoints,
                                     ENTRYPOINTS_SIZE);
       }
       Attached++;
       break;
  // Call DestroyProtocol.
  case DLL_PROCESS_DETACH:
       // Unloading parser DLL.
       Attached--;
       if(Attached == 0)
       {
         DestroyProtocol( hProtocol);
       }
       break;
  }
  return TRUE;
}