Compartilhar via


Descarregando um módulo de provedor

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

A função Unload de um módulo de provedor garante que o módulo do provedor seja desregistrado do NMR (Registrador de Módulos de Rede) antes que o módulo do provedor seja descarregado da memória do sistema. Um módulo de provedor inicia o cancelamento do registro do NMR chamando a função NmrDeregisterProvider , que normalmente chama de sua função Unload . Um módulo de provedor não deve retornar de sua função Unload até que ele tenha sido completamente desregistrado do NMR. Se a chamada para NmrDeregisterProvider retornar STATUS_PENDING, o módulo do provedor deverá chamar a função NmrWaitForProviderDeregisterComplete 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 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
    ...
  }
}

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

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 de provedor não é necessário para chamar NmrDeregisterProvider de dentro de sua função Unload . Por exemplo, na situação em que um módulo de provedor é um subcomponente de um driver complexo, o cancelamento do registro do módulo do provedor pode ocorrer quando o subcomponente do módulo do provedor é desativado. No entanto, nessa situação, o driver ainda deve garantir que o módulo do provedor tenha sido completamente desregistrado da NMR antes de retornar de sua função Unload .