Freigeben über


Debuggen einer fehlerhaften Treiberentladung

Ein Treiber wird nicht entladen, wenn ein kompromittiertes Verweis auf DeviceObject oder DriverObject vorliegt. Dies ist eine häufige Ursache für fehlerhafte Treiberentladungen.

Neben IoCreateDevice gibt es mehrere Funktionen, die auf DriverObject und DeviceObject verweisen. Wenn Sie die Richtlinien für die Verwendung der Funktionen nicht befolgen, wird der Verweis verloren.

Hier ist ein Beispiel für das Debuggen dieses Problems. Obwohl DeviceObject in diesem Beispiel verwendet wird, funktioniert diese Technik für alle Objekte.

Beheben eines Treibers, der nicht entladen werden kann

  1. Legen Sie einen Haltepunkt direkt nach dem Aufrufen von IoCreateDevice durch den Treiber ein. Rufen Sie die DeviceObject-Adresse ab .

  2. Suchen Sie den Objektheader mithilfe der !object-Erweiterung für diese Objektadresse:

    kd> !object 81a578c0 
    Object: 81a578c0  Type: (81bd0e70) Device
        ObjectHeader: 81a578a8
        HandleCount: 0  PointerCount: 3
        Directory Object: e1001208  Name: Serial0 
    

    Die erste Variable im ObjectHeader ist die Zeigeranzahl oder Verweisanzahl.

  3. Setzen Sie einen Schreibhaltepunkt auf die Zeigeranzahl, indem Sie die Adresse des ObjectHeaders verwenden:

    kd> ba w4 81a578a8 "k;g" 
    
  4. Verwenden Sie g (Go). Der Debugger erzeugt ein Protokoll.

  5. Suchen Sie nach dem nicht übereinstimmenden Verweis-/Dereferenzierungspaar, insbesondere nach einer fehlenden Dereferenzierung. (Beachten Sie, dass ObReferenceObject als Makro im Kernel implementiert ist.)