Depurando um descarregamento de driver com falha
Um driver não será descarregado se houver uma referência vazada para DeviceObject ou DriverObject. Essa é uma causa comum de descarregamentos de driver com falha.
Além de IoCreateDevice, há várias funções que fazem referência a DriverObject e DeviceObject. Se você não seguir as diretrizes para usar as funções, acabará vazando a referência.
Aqui está um exemplo de como depurar esse problema. Embora DeviceObject seja usado neste exemplo, essa técnica funciona para todos os objetos.
Corrigir um driver que falha ao descarregar
Coloque um ponto de interrupção logo após o driver chamar IoCreateDevice. Obtenha o endereço DeviceObject .
Localize o cabeçalho do objeto usando a extensão de objeto ! neste endereço de objeto:
kd> !object 81a578c0 Object: 81a578c0 Type: (81bd0e70) Device ObjectHeader: 81a578a8 HandleCount: 0 PointerCount: 3 Directory Object: e1001208 Name: Serial0
A primeira variável no ObjectHeader é a contagem de ponteiros ou a contagem de referências.
Coloque um ponto de interrupção de gravação na contagem de ponteiros usando o endereço do ObjectHeader:
kd> ba w4 81a578a8 "k;g"
Use g (Go). O depurador produzirá um log.
Procure o par de referência/desreferência incompatível , especificamente, uma desreferência ausente. (Observe que ObReferenceObject é implementado como uma macro dentro do kernel.)