Udostępnij za pośrednictwem


Debugowanie nieudanego rozładowania sterownika

Sterownik nie zostanie rozładowany, jeśli istnieje wyciek odwołania do DeviceObject lub DriverObject. Jest to częsta przyczyna zwolnienia sterownika, który zakończył się niepowodzeniem.

Oprócz IoCreateDeviceistnieje kilka funkcji, które odwołują się do DriverObject i DeviceObject. Jeśli nie zastosujesz się do wytycznych dotyczących korzystania z funkcji, spowodujesz wyciek odwołania.

Oto przykład debugowania tego problemu. Mimo że DeviceObject jest używana w tym przykładzie, ta technika działa dla wszystkich obiektów.

Naprawa sterownika, który nie rozładowuje się

  1. Umieść punkt przerwania zaraz po tym, jak sterownik wywoła IoCreateDevice. Pobierz adres DeviceObject.

  2. Znajdź nagłówek obiektu przy użyciu rozszerzenia !object na tym adresie obiektu:

    kd> !object 81a578c0 
    Object: 81a578c0  Type: (81bd0e70) Device
        ObjectHeader: 81a578a8
        HandleCount: 0  PointerCount: 3
        Directory Object: e1001208  Name: Serial0 
    

    Pierwszą zmienną w ObjectHeader jest liczba wskaźników lub liczba odwołań .

  3. Ustaw punkt przerwania zapisu dla liczby wskaźników, używając adresu ObjectHeader.

    kd> ba w4 81a578a8 "k;g" 
    
  4. Użyj g (Go). Debuger utworzy dziennik.

  5. Poszukaj niezgodnej pary odwołanie/wyłuszczenie — w szczególności brakującego wyłuszczenia. (Należy pamiętać, że obReferenceObject jest implementowana jako makro wewnątrz jądra).