디바이스 및 컨트롤러 개체 해제
드라이버가 디바이스 또는 컨트롤러 개체를 삭제하기 전에 다른 드라이버의 개체에 대한 포인터 또는 해당 디바이스 또는 컨트롤러 확장에 저장된 개체를 중단하는 등의 외부 리소스에 대한 참조를 해제해야 합니다. 그런 다음 드라이버가 만든 각 디바이스 개체에 대해 IoDeleteDevice 를 호출할 수 있습니다. 이전에 IoCreateController 를 호출한 비 WDM 드라이버도 IoDeleteController를 호출해야 합니다.
드라이버가 디바이스 확장에 스토리지를 제공하는 커널 정의 개체는 언로드 루틴이 해당 디바이스 개체로 IoDeleteDevice 를 호출할 때 자동으로 해제됩니다. 일반적으로 드라이버가 디바이스 확장에서 해당 개체에 대한 스토리지를 제공한 경우 DriverEntry 또는 Reinitialize 루틴이 KeInitializeXxx 를 호출하여 설정한 모든 개체를 IoDeleteDevice 호출로 해제할 수 있습니다. 예를 들어 드라이버에 CustomTimerDpc 루틴이 있고 디바이스 확장에 필요한 DPC 및 타이머 개체에 대한 스토리지를 제공한 경우 IoDeleteDevice 호출은 이러한 시스템 리소스를 해제합니다.
마찬가지로 드라이버가 컨트롤러 확장에 스토리지를 제공하는 커널 정의 개체는 Unload 루틴이 해당 컨트롤러 개체를 사용하여 IoDeleteController 를 호출할 때 자동으로 해제됩니다.
DriverEntry 또는 IoGetConfigurationInformation이라는 루틴을 다시 초기화하여 특정 유형의 디바이스에 대한 개수를 증가시키는 경우 언로드 루틴은 IoGetConfigurationInformation을 호출하고 해당 디바이스 개체를 삭제할 때 I/O 관리자의 전역 구성 정보 구조에서 해당 디바이스의 개수를 감소시켜야 합니다.
컨트롤을 반환하기 전에 언로드 루틴은 다른 드라이버 루틴에서 아직 해제되지 않은 다른 드라이버 할당 리소스를 해제해야 합니다.