클라이언트 모듈 언로드
클라이언트 모듈을 언로드하기 위해 운영 체제는 클라이언트 모듈의 언로드 함수를 호출합니다. 초기화 중에 클라이언트 모듈의 언로드 함수를 지정하는 방법에 대한 자세한 내용은 클라이언트 모듈 초기화 및 등록을 참조하세요.
클라이언트 모듈의 언로드 함수는 클라이언트 모듈이 시스템 메모리에서 언로드되기 전에 클라이언트 모듈이 NMR(네트워크 모듈 등록 기관)에서 등록 취소되도록 합니다. 클라이언트 모듈은 일반적으로 Unload 함수에서 호출하는 NmrDeregisterClient 함수를 호출하여 NMR에서 등록 취소를 시작합니다. 클라이언트 모듈은 NMR에서 완전히 등록 취소될 때까지 언로드 함수에서 반환해서는 안 됩니다. NmrDeregisterClient에 대한 호출이 STATUS_PENDING 반환하는 경우 클라이언트 모듈은 NmrWaitForClientDeregisterComplete 함수를 호출하여 등록 취소가 완료되기를 기다렸다가 Unload 함수에서 반환되어야 합니다.
예:
// 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
...
}
}
클라이언트 모듈이 여러 NPI(네트워크 프로그래밍 인터페이스)의 클라이언트로 등록된 경우 지원하는 각 NPI에 대해 NmrDeregisterClient 를 호출해야 합니다. 네트워크 모듈이 클라이언트 모듈과 공급자 모듈(즉, 한 NPI의 클라이언트이고 다른 NPI 공급자)로 등록된 경우 NmrDeregisterClient 와 NmrDeregisterProvider를 모두 호출해야 합니다.
네트워크 모듈은 언로드 함수에서 반환하기 전에 모든 등록 취소가 완료될 때까지 기다려야 합니다.
클라이언트 모듈은 Unload 함수 내에서 NmrDeregisterClient를 호출할 필요가 없습니다. 예를 들어 클라이언트 모듈이 복잡한 드라이버의 하위 구성 요소인 경우 클라이언트 모듈 하위 구성 요소가 비활성화될 때 클라이언트 모듈의 등록 취소가 발생할 수 있습니다. 그러나 이러한 상황에서 드라이버는 언로드 함수에서 반환하기 전에 클라이언트 모듈이 NMR에서 완전히 등록 취소되었는지 확인해야 합니다.