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

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

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

다음은 이 문제를 디버그하는 방법의 예입니다. 이 예제에서는 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 는 커널 내에서 매크로로 구현됩니다.)