Udostępnij za pośrednictwem


Rozładowanie modułu dostawcy

Aby zwolnić moduł dostawcy, system operacyjny wywołuje funkcję Unload modułu dostawcy. Zobacz Inicjowanie i rejestrowanie modułu dostawcy , aby uzyskać więcej informacji na temat sposobu określania funkcji Unload modułu dostawcy podczas inicjowania.

Funkcja Unload modułu dostawcy gwarantuje, że moduł dostawcy zostanie wyrejestrowany z rejestratora modułów sieciowych (NMR), zanim moduł dostawcy zostanie zwolniony z pamięci systemowej. Moduł dostawcy inicjuje wyrejestrowanie z NMR, wywołując funkcję NmrDeregisterProvider, którą zwykle wywołuje z funkcji Unload. Moduł dostawcy nie może powrócić z funkcji Unload , dopóki nie zostanie całkowicie wyrejestrowany z nmR. Jeśli wywołanie metody NmrDeregisterProvider zwróci STATUS_PENDING, moduł dostawcy musi wywołać funkcję NmrWaitForProviderDeregisterComplete , aby poczekać na zakończenie wyrejestrowania, zanim powróci z funkcji Unload .

Na przykład:

// 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
    ...
  }
}

Jeśli moduł dostawcy jest zarejestrowany jako dostawca wielu interfejsów programowania sieciowego (NPI), musi wywołać nmrDeregisterProvider dla każdego obsługiwanego serwera NPI. Jeśli moduł sieciowy jest zarejestrowany zarówno jako moduł dostawcy, jak i moduł klienta (czyli jest to dostawca jednego serwera NPI i klienta innego serwera NPI), musi wywołać zarówno NmrDeregisterProvider , jak i NmrDeregisterClient.

Moduł sieciowy musi poczekać, aż wszystkie wyrejestrowania zostaną zakończone, zanim powróci z funkcji Unload.

Moduł dostawcy nie musi wywoływać NmrDeregisterProvider wewnątrz funkcji Unload. Na przykład w sytuacji, gdy moduł dostawcy jest podskładem złożonego sterownika, wyrejestrowanie modułu dostawcy może wystąpić, gdy podskład moduł dostawcy jest dezaktywowany. Jednak w takiej sytuacji sterownik musi nadal upewnić się, że moduł dostawcy został całkowicie wyrejestrowany z NMR przed powrotem z funkcji Unload .