Реализация средства синтаксического анализа DllMain

Сетевой монитор использует функцию экспорта DllMain для идентификации существования средства синтаксического анализа и выпуска ресурсов, которые сетевой монитор использует для хранения сведений о средстве синтаксического анализа.

При первом вызове DllMain средство синтаксического анализа вызывает CreateProtocol выполнить следующие действия:

  • Укажите протокол, который обнаруживает средство синтаксического анализа.
  • Укажите точки входа для оставшихся функций экспорта синтаксического анализа, которые вызываются сетевым монитором.

Когда Network Monitor вызывает DllMain в последний раз, DllMain вызывает DestroyProtocol, чтобы освободить все ресурсы, которые Network Monitor использует для хранения информации о синтаксическом анализаторе.

Следующая процедура определяет шаги, необходимые для реализации DllMain.

Для реализации DllMain

  1. Укажите структуру ENTRYPOINTS для функции CreateProtocol и глобальной переменной Attach. Переменная Attach используется для отслеживания количества запущенных экземпляров протокола.

  2. Просмотрите значение параметра команды, который задает операционная система.

    Если для параметра Command задано значение DLL_PROCESS_ATTACH и присоединение имеет значение 0, вызовите CreateProtocol, чтобы указать имя протокола и точки входа для следующих функций экспорта.

    • Регистрация
    • Отмена регистрации
    • РаспознатьКадр
    • ПрисоединитьСвойства
    • FormatProperties (только в случае, если сетевой монитор будет отображать свойства протокола).

    Если для параметра команды задано значение DLL_PROCESS_DETACH и Attach равен 0, вызовите DestroyProtocol с помощью дескриптора экземпляра, возвращаемого CreateProtocol.

  3. Возвращает TRUE, так как функция синтаксического анализа DllMain всегда должна возвращать TRUE.

Ниже приведена базовая реализация DllMain. В примере кода используется оператор case для перехвата значений параметра команды, чтобы определить, следует ли вызывать 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;
}