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


Отладка неудавленной выгрузки драйвера

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