다음을 통해 공유


실패한 드라이버 언로드 디버깅

DeviceObject 또는 DriverObject에 대한 유출된 참조가 있는 경우 드라이버는 언로드되지 않습니다. 이는 드라이버 언로드 실패의 일반적인 원인입니다.

IoCreateDevice 외에도 DriverObject 및 DeviceObject를 참조하는 여러 함수 있습니다. 함수 사용에 대한 지침을 따르지 않으면 참조가 누출됩니다.

다음은 이 문제를 디버그하는 방법의 예입니다. 이 예제에서는 DeviceObject 가 사용되지만 이 기술은 모든 개체에 대해 작동합니다.

언로드에 실패한 드라이버 수정

  1. 드라이버가 IoCreateDevice를 호출한 직후에 중단점을 배치합니다. DeviceObject 주소를 가져옵니다.

  2. 이 개체 주소에서 !object 확장을 사용하여 개체 헤더를 찾습니다.

    kd> !object 81a578c0 
    Object: 81a578c0  Type: (81bd0e70) Device
        ObjectHeader: 81a578a8
        HandleCount: 0  PointerCount: 3
        Directory Object: e1001208  Name: Serial0 
    

    ObjectHeader의 첫 번째 변수는 포인터 수 또는 참조 수입니다.

  3. ObjectHeader의 주소를 사용하여 포인터 수에 쓰기 중단점을 배치합니다.

    kd> ba w4 81a578a8 "k;g" 
    
  4. g(Go)를 사용합니다. 디버거는 로그를 생성합니다.

  5. 일치하지 않는 참조/역참조 쌍( 특히 누락된 역참조)을 찾습니다. (ObReferenceObject는 커널 내에서 매크로로 구현됩니다.)