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