Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер не выгрузит, если существует утечка ссылки на 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 реализуется как макрос внутри ядра.)