다음을 통해 공유


공급자 모듈 언로드

공급자 모듈을 언로드하기 위해 운영 체제는 공급자 모듈의 Unload 함수를 호출합니다. 초기화하는 동안 공급자 모듈Unload 함수를 지정하는 방법에 대한 자세한 내용은 공급자 모듈 초기화 및 등록을 참조하세요.

공급자 모듈의 Unload 함수는 공급자 모듈이 시스템 메모리에서 언로드되기 전에 공급자 모듈이 NMR(네트워크 모듈 등록 기관)에서 등록 취소되도록 합니다. 공급자 모듈은 일반적으로 Unload 함수에서 호출하는 NmrDeregisterProvider 함수를 호출하여 NMR에서 등록 취소를 시작합니다. 공급자 모듈은 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
    ...
  }
}

공급자 모듈이 여러 NPI(네트워크 프로그래밍 인터페이스)의 공급자로 등록된 경우 지원하는 각 NPI에 대해 NmrDeregisterProvider 를 호출해야 합니다. 네트워크 모듈이 공급자 모듈과 클라이언트 모듈(즉, 한 NPI의 공급자이고 다른 NPI의 클라이언트)로 등록된 경우 NmrDeregisterProviderNmrDeregisterClient를 모두 호출해야 합니다.

네트워크 모듈은 Unload 함수에서 반환하기 전에 모든 등록 취소가 완료될 때까지 기다려야 합니다.

공급자 모듈은 Unload 함수 내에서 NmrDeregisterProvider를 호출할 필요가 없습니다. 예를 들어 공급자 모듈이 복잡한 드라이버의 하위 구성 요소인 경우 공급자 모듈 하위 구성 요소가 비활성화될 때 공급자 모듈의 등록 취소가 발생할 수 있습니다. 그러나 이러한 상황에서 드라이버는 언로드 함수에서 반환하기 전에 공급자 모듈이 NMR에서 완전히 등록 취소되었는지 확인해야 합니다.