Depuración de una descarga de controlador con error
Un controlador no se descargará si hay una referencia filtrada a DeviceObject o DriverObject. Se trata de una causa común de descargas de controladores con errores.
Además de IoCreateDevice, hay varias funciones que toman referencia a DriverObject y DeviceObject. Si no sigue las instrucciones para usar las funciones, terminará filtrando la referencia.
Este es un ejemplo de cómo depurar este problema. Aunque deviceObject se usa en este ejemplo, esta técnica funciona para todos los objetos.
Corrección de un controlador que no se puede descargar
Coloque un punto de interrupción justo después de que el controlador llame a IoCreateDevice. Obtenga la dirección deviceObject .
Busque el encabezado de objeto mediante la extensión !object en esta dirección de objeto:
kd> !object 81a578c0 Object: 81a578c0 Type: (81bd0e70) Device ObjectHeader: 81a578a8 HandleCount: 0 PointerCount: 3 Directory Object: e1001208 Name: Serial0
La primera variable de ObjectHeader es el recuento de punteros o el recuento de referencias.
Coloque un punto de interrupción de escritura en el recuento de punteros mediante la dirección de ObjectHeader:
kd> ba w4 81a578a8 "k;g"
Use g (Go).. El depurador generará un registro.
Busque el par de referencias o desreferencias no coincidentes; en concreto, falta una desreferencia. (Tenga en cuenta que ObReferenceObject se implementa como una macro dentro del kernel).