Поделиться через


Выгрузка клиентского модуля

Чтобы выгрузить клиентский модуль, операционная система вызывает функцию Выгрузки клиентского модуля. Дополнительные сведения о том, как указать функцию Unload клиентского модуля во время инициализации, см. в разделе Инициализация и регистрация клиентского модуля.

Функция Unload клиентского модуля гарантирует, что клиентский модуль будет удален из регистратора сетевых модулей (NMR) перед выгрузкой клиентского модуля из системной памяти. Клиентский модуль инициирует отмену регистрации из NMR, вызывая функцию NmrDeregisterClient , которую он обычно вызывает из своей функции Unload . Клиентский модуль не должен возвращать данные из функции Unload до тех пор, пока он не будет полностью удален из NMR. Если вызов NmrDeregisterClient возвращает STATUS_PENDING, клиентский модуль должен вызвать функцию NmrWaitForClientDeregisterComplete , чтобы дождаться завершения отмены регистрации, прежде чем он вернется из функции Unload .

Пример:

// Variable containing the handle for the registration
HANDLE ClientHandle;

// Unload function
VOID
  Unload(
    IN PDRIVER_OBJECT DriverObject
    )
{
  NTSTATUS Status;

  // Deregister the client module from the NMR
  Status =
    NmrDeregisterClient(
      ClientHandle
      );

  // Check if pending
  if (Status == STATUS_PENDING)
  {
    // Wait for the deregistration to be completed
    NmrWaitForClientDeregisterComplete(
      ClientHandle
      );
  }

  // An error occurred
  else
  {
    // Handle error
    ...
  }
}

Если клиентский модуль зарегистрирован как клиент нескольких сетевых программных интерфейсов (NPI), он должен вызывать NmrDeregisterClient для каждого NPI, который он поддерживает. Если сетевой модуль зарегистрирован как клиентский модуль и модуль поставщика (то есть он является клиентом одного NPI и поставщиком другого NPI), он должен вызывать как NmrDeregisterClient , так и NmrDeregisterProvider.

Сетевой модуль должен подождать, пока все отмены регистрации будут завершены, прежде чем вернуться из своей функции Unload .

Клиентский модуль не требуется для вызова NmrDeregisterClient из функции Unload . Например, в ситуации, когда клиентский модуль является подкомпонентом сложного драйвера, отмена регистрации клиентского модуля может произойти при отключении подкомпонента клиентского модуля. Однако в такой ситуации драйвер по-прежнему должен убедиться, что клиентский модуль полностью удален из NMR, прежде чем возвращать его функцию Unload .