卸除提供者模組
若要卸除提供者模組,作系統會呼叫提供者模組的 Unload 函式。 如需如何在初始化期間指定提供者 模組 Unload 函式的詳細資訊,請參閱 初始化和註冊提供者模組模組。
提供者模組的 Unload 函式可確保提供者模組在從系統記憶體卸載之前,先從網路模組登錄器 (NMR) 取消註冊提供者模組。 提供者模組通過呼叫 NmrDeregisterProvider 函式,從 NMR 開始取消註冊,通常會從其 Unload 函式呼叫。 在完全從 NMR 取消註冊之前,提供者模組不可以從其 Unload 函式返回。 如果呼叫 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
...
}
}
如果提供者模組註冊為多個 網路程式設計介面 (NPIs)的提供者,則必須針對它所支援的每個 NPI 呼叫 NmrDeregisterProvider。 如果網路模組同時註冊為提供者模組和用戶端模組(亦即,它是一個 NPI 的提供者,另一個 NPI 的用戶端),則必須呼叫兩者 NmrDeregisterProvider 和 NmrDeregisterClient。
網路模組必須等到所有取消註冊都完成後,才能從其 Unload 函式返回。
提供者模組不需要從其 Unload 函式內呼叫 NmrDeregisterProvider。 例如,在提供者模組作為複雜驅動程式的子元件的情況下,當提供者模組子元件停用時,可能會取消註冊提供者模組。 驅動程式在這種情況下仍必須確保提供者模組已完全從NMR解除註冊,然後從其 Unload 函式返回。