Compartilhar via


Descarregando um módulo de cliente

Para descarregar um módulo cliente, o sistema operacional chama a função Unload do módulo cliente. Consulte Inicializando e registrando um módulo de cliente para obter mais informações sobre como especificar a função Unload de um módulo cliente durante a inicialização.

A função Unload de um módulo cliente garante que o módulo cliente seja desregistrado do NMR (Registrador de Módulos de Rede) antes que o módulo cliente seja descarregado da memória do sistema. Um módulo cliente inicia o cancelamento do registro do NMR chamando a função NmrDeregisterClient , que normalmente chama de sua função Unload . Um módulo cliente não deve retornar de sua função Unload até que ele tenha sido completamente desregistrado do NMR. Se a chamada para NmrDeregisterClient retornar STATUS_PENDING, o módulo cliente deverá chamar a função NmrWaitForClientDeregisterComplete para aguardar a conclusão do cancelamento do registro antes de retornar de sua função Unload .

Por exemplo:

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

Se um módulo cliente for registrado como um cliente de várias NPIs (Interfaces de Programação de Rede), ele deverá chamar NmrDeregisterClient para cada NPI compatível. Se um módulo de rede for registrado como um módulo cliente e um módulo de provedor (ou seja, ele for um cliente de uma NPI e um provedor de outra NPI), ele deverá chamar NmrDeregisterClient e NmrDeregisterProvider.

Um módulo de rede deve aguardar até que todos os cancelamentos de registro sejam concluídos antes de retornar de sua função Unload .

Um módulo cliente não é necessário para chamar NmrDeregisterClient de dentro de sua função Unload . Por exemplo, na situação em que um módulo de cliente é um subcomponente de um driver complexo, o cancelamento do registro do módulo cliente pode ocorrer quando o subcomponente do módulo do cliente é desativado. No entanto, nessa situação, o driver ainda deve garantir que o módulo cliente tenha sido completamente desregistrado da NMR antes de retornar de sua função Unload .