共用方式為


卸除提供者模組

若要卸除提供者模組,作系統會呼叫提供者模組的 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 的用戶端),則必須呼叫兩者 NmrDeregisterProviderNmrDeregisterClient

網路模組必須等到所有取消註冊都完成後,才能從其 Unload 函式返回。

提供者模組不需要從其 Unload 函式內呼叫 NmrDeregisterProvider。 例如,在提供者模組作為複雜驅動程式的子元件的情況下,當提供者模組子元件停用時,可能會取消註冊提供者模組。 驅動程式在這種情況下仍必須確保提供者模組已完全從NMR解除註冊,然後從其 Unload 函式返回。