次の方法で共有


プロバイダー モジュールのアンロード

プロバイダー モジュールをアンロードするために、オペレーティング システムはプロバイダー モジュールの Unload 関数を呼び出します。 初期化中にプロバイダー モジュールUnload 関数を指定する方法の詳細については、プロバイダー モジュールの初期化と登録を参照してください。

プロバイダー モジュールの Unload 関数を使用すると、プロバイダー モジュールがシステム メモリからアンロードされる前に、プロバイダー モジュールがネットワーク モジュール レジストラー (NMR) から登録解除されます。 プロバイダー モジュールは、通常、Unload 関数から呼び出すNmrDeregisterProvider 関数を呼び出すことによって、NMR から登録解除を開始します。 プロバイダー モジュールは、完全にNMR から登録解除されるまで、 Unload 関数から戻らてはなりません。 NmrDeregisterProvider への呼び出しがSTATUS_PENDINGを返す場合、プロバイダー モジュールは、登録解除が完了するまで待機してから Unload 関数から戻る前に、NmrWaitForProviderDeregisterComplete 関数を呼び出す必要があります。

例えば次が挙げられます。

// 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 を呼び出す必要があります。 ネットワーク モジュールがプロバイダー モジュールとクライアント モジュール (つまり、1 つの NPI のプロバイダーであり、別の NPI のクライアント) の両方として登録されている場合は、 NmrDeregisterProviderNmrDeregisterClient の両方を呼び出す必要があります。

ネットワークモジュールは、すべての解除が完了するまで待機してから、Unload関数から戻る必要があります。

プロバイダー モジュールは、Unload 関数内からNmrDeregisterProvider を呼び出す必要はありません。 たとえば、プロバイダー モジュールが複雑なドライバーのサブコンポーネントである状況では、プロバイダー モジュールサブコンポーネントが非アクティブ化されるときに、プロバイダー モジュールの登録解除が発生する可能性があります。 ただし、このような状況では、ドライバーは、その Unload 関数から戻る前に、プロバイダー モジュールが完全にNMR から登録解除されていることを確認する必要があります。