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


Выгрузка модуля поставщика

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

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

Пример:

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

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

  // Deregister the provider module from the NMR
  Status =
    NmrDeregisterProvider(
      ProviderHandle
      );

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

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

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

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

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