Отладка неудавленной выгрузки драйвера
Драйвер не выгрузится, если произошла утечка ссылки на 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 реализуется как макрос внутри ядра.)