共用方式為


實作 DllMain 剖析器

網路監視器會使用 DllMain 匯出函式來識別剖析器是否存在,並釋放網路監視器用來儲存剖析器相關資訊的資源。

當網路監視器第一次呼叫 DllMain 時,剖析器 DLL 會呼叫 CreateProtocol 來執行下列動作:

  • 指定剖析器偵測到的通訊協定。
  • 提供網路監視器呼叫之其餘剖析器匯出函式的進入點。

當網路監視器上次呼叫DllMain 時,DllMain會呼叫DestroyProtocol來釋放網路監視器用來儲存剖析器相關資訊的所有資源。

下列程式會識別實作 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傳回的實例控制碼呼叫DestroyProtocol

  3. 傳回 TRUE ,因為 DllMain 剖析器函式必須一律傳回 TRUE

以下是 DllMain的基本實作。 程式碼範例會使用 case 語句來捕捉 Command 參數的值,以判斷是否應該呼叫 CreateProtocolDestroyProtocol

#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;
}