Debug di un driver non riuscito scaricamento

Se si verifica una perdita di riferimento a DeviceObject o DriverObject, un driver non verrà scaricato. Si tratta di una causa comune dello scaricamento del driver non riuscito.

Oltre a IoCreateDevice, esistono diverse funzioni che fanno riferimento a DriverObject e DeviceObject. Se non si seguono le linee guida per l'uso delle funzioni, si perderà il riferimento.

Di seguito è riportato un esempio di come eseguire il debug di questo problema. Sebbene DeviceObject venga usato in questo esempio, questa tecnica funziona per tutti gli oggetti.

Correzione di un driver che non riesce a scaricare

  1. Posizionare un punto di interruzione subito dopo che il driver chiama IoCreateDevice. Ottenere l'indirizzo DeviceObject .

  2. Trovare l'intestazione dell'oggetto usando l'estensione !object in questo indirizzo dell'oggetto:

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

    La prima variabile in ObjectHeader è il numero di puntatori o il conteggio dei riferimenti.

  3. Inserire un punto di interruzione di scrittura nel conteggio dei puntatori usando l'indirizzo di ObjectHeader:

    kd> ba w4 81a578a8 "k;g" 
    
  4. Usare g (Go). Il debugger produrrà un log.

  5. Cercare la coppia riferimento/dereferenziazione non corrispondente, in particolare una dereferenziazione mancante. Si noti che ObReferenceObject viene implementato come macro all'interno del kernel.