실패한 드라이버 언로드 디버깅
DeviceObject 또는 DriverObject에 대한 유출된 참조가 있는 경우 드라이버는 언로드되지 않습니다. 이는 드라이버 언로드 실패의 일반적인 원인입니다.
IoCreateDevice 외에도 DriverObject 및 DeviceObject를 참조하는 여러 함수가 있습니다. 함수 사용에 대한 지침을 따르지 않으면 참조가 누출됩니다.
다음은 이 문제를 디버그하는 방법의 예입니다. 이 예제에서는 DeviceObject 가 사용되지만 이 기술은 모든 개체에 대해 작동합니다.
언로드에 실패한 드라이버 수정
드라이버가 IoCreateDevice를 호출한 직후에 중단점을 배치합니다. DeviceObject 주소를 가져옵니다.
이 개체 주소에서 !object 확장을 사용하여 개체 헤더를 찾습니다.
kd> !object 81a578c0 Object: 81a578c0 Type: (81bd0e70) Device ObjectHeader: 81a578a8 HandleCount: 0 PointerCount: 3 Directory Object: e1001208 Name: Serial0
ObjectHeader의 첫 번째 변수는 포인터 수 또는 참조 수입니다.
ObjectHeader의 주소를 사용하여 포인터 수에 쓰기 중단점을 배치합니다.
kd> ba w4 81a578a8 "k;g"
g(Go)를 사용합니다. 디버거는 로그를 생성합니다.
일치하지 않는 참조/역참조 쌍( 특히 누락된 역참조)을 찾습니다. (ObReferenceObject는 커널 내에서 매크로로 구현됩니다.)