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
Posizionare un punto di interruzione subito dopo che il driver chiama IoCreateDevice. Ottenere l'indirizzo DeviceObject .
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.
Inserire un punto di interruzione di scrittura nel conteggio dei puntatori usando l'indirizzo di ObjectHeader:
kd> ba w4 81a578a8 "k;g"
Usare g (Go). Il debugger produrrà un log.
Cercare la coppia riferimento/dereferenziazione non corrispondente, in particolare una dereferenziazione mancante. Si noti che ObReferenceObject viene implementato come macro all'interno del kernel.