偵錯失敗的驅動程式卸載
如果 DeviceObject 或 DriverObject的參考外泄,驅動程式將不會卸載。 這是失敗驅動程式卸載的常見原因。
除了 IoCreateDevice之外,有數個函式會參考 DriverObject 和 DeviceObject。 如果您未遵循使用函式的指導方針,最後會洩漏參考。
以下是如何偵錯此問題的範例。 雖然此範例中使用 DeviceObject ,但這項技術適用于所有物件。
修正無法卸載的驅動程式
將中斷點放在驅動程式呼叫 IoCreateDevice之後。 取得 DeviceObject 位址。
在此物件位址上使用 !object extension 來尋找物件標頭:
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 會實作為 kernel.) 內的宏