Поделиться через


Отладка сбоя при выгрузке драйвера

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