Débogage d’un déchargement de pilote ayant échoué
Un pilote ne se décharge pas en cas de fuite de référence à DeviceObject ou DriverObject. Il s’agit d’une cause courante de déchargements de pilotes ayant échoué.
Outre IoCreateDevice, plusieurs fonctions font référence à DriverObject et DeviceObject. Si vous ne suivez pas les instructions relatives à l’utilisation des fonctions, vous finirez par faire fuiter la référence.
Voici un exemple de débogage de ce problème. Bien que DeviceObject soit utilisé dans cet exemple, cette technique fonctionne pour tous les objets.
Correction d’un pilote qui ne parvient pas à décharger
Placez un point d’arrêt juste après que le pilote a appelé IoCreateDevice. Obtenez l’adresse DeviceObject .
Recherchez l’en-tête d’objet à l’aide de l’extension !object sur l’adresse de cet objet :
kd> !object 81a578c0 Object: 81a578c0 Type: (81bd0e70) Device ObjectHeader: 81a578a8 HandleCount: 0 PointerCount: 3 Directory Object: e1001208 Name: Serial0
La première variable dans ObjectHeader est le nombre de pointeurs ou le nombre de références.
Placez un point d’arrêt d’écriture sur le nombre de pointeurs, à l’aide de l’adresse de ObjectHeader :
kd> ba w4 81a578a8 "k;g"
Utilisez g (Go). Le débogueur génère un journal.
Recherchez la paire référence/déréférence incompatible, en particulier une déréférence manquante. (Notez que ObReferenceObject est implémenté en tant que macro à l’intérieur du noyau.)