Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы выгрузить клиентский модуль, операционная система вызывает функцию Unload клиентского модуля. Дополнительную информацию о том, как указать функцию выгрузки модуля клиентского во время инициализации, смотрите в разделе инициализации и регистрации клиентского модуля.
Функция выгрузки гарантирует, что клиентский модуль сначала удаляется из регистратора сетевых модулей (NMR), прежде чем его выгрузят из системной памяти. Клиентский модуль инициирует отмену регистрации из NMR путем вызова функции NmrDeregisterClient, которая обычно вызывается из функции Выгрузка. Клиентский модуль не должен возвращаться из функции выгрузки до тех пор, пока не будет полностью удалён из NMR. Если вызов NmrDeregisterClient возвращает STATUS_PENDING, клиентский модуль должен вызвать функцию NmrWaitForClientDeregisterComplete, чтобы дождаться завершения дерегистрации, и только потом возвращаться из своей функции Выгрузки.
Рассмотрим пример.
// 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
...
}
}
Если клиентский модуль зарегистрирован в качестве клиента нескольких сетевых интерфейсов программирования (NP), он должен вызывать NmrDeregisterClient для каждого NPI, который он поддерживает. Если сетевой модуль зарегистрирован как клиентский модуль, так и модуль поставщика (то есть это клиент одного NPI и поставщика другого NPI), он должен вызывать как NmrDeregisterClient, так и NmrDeregisterProvider.
Сетевой модуль должен ждать завершения всех дерегистраций, прежде чем вернуться из функции Выгрузки.
Не требуется, чтобы клиентский модуль вызывал NmrDeregisterClient из своей функции Выгрузки. Например, в ситуации, когда клиентский модуль является подкомпонентом сложного драйвера, дерегистрация клиентского модуля может возникать при деактивации подкомпонента клиентского модуля. Однако в такой ситуации драйвер должен убедиться, что клиентский модуль полностью дерегистрирован из NMR, прежде чем вернуться из своей функции Выгрузить.