共用方式為


偵錯失敗的驅動程式卸載

如果 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 會實作為 kernel.) 內的宏