Выгрузка модуля поставщика
Чтобы выгрузить модуль поставщика, операционная система вызывает функцию 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 .