如果 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: Serial0ObjectHeader 中的第一個變數是指標計數或參考計數。
使用 ObjectHeader 的位址,在指標計數上設定寫入斷點:
kd> ba w4 81a578a8 "k;g"使用 g (Go)。 調試程式會產生記錄檔。
尋找不相符的參考/取值組 -- 特別是遺漏的取值。 (請注意 ,ObReferenceObject 會實作為核心內的巨集。