共用方式為


調試失敗的驅動程式卸載

如果 DeviceObjectDriverObject 參考外洩,驅動程式將不會卸載。 這是驅動程式卸除失敗的常見原因。

除了 IoCreateDevice 之外,還有數個函式會參考 DriverObjectDeviceObject。 如果您未遵循使用函式的指南,您最終將會洩漏參照。

以下是如何偵錯此問題的範例。 雖然此範例中使用 DeviceObject ,但這項技術適用於所有物件。

修正無法卸除的驅動程式

  1. 將斷點放在驅動程式呼叫 IoCreateDevice之後。 取得 DeviceObject 位址。

  2. 在這裡物件位址上使用 !object extension 來尋找物件標頭:

    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 會實作為核心內的巨集。