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ę
Umieść punkt przerwania zaraz po tym, jak sterownik wywoła IoCreateDevice. Pobierz adres DeviceObject.
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ń .
Ustaw punkt przerwania zapisu dla liczby wskaźników, używając adresu ObjectHeader.
kd> ba w4 81a578a8 "k;g"
Użyj g (Go). Debuger utworzy dziennik.
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).