Partager via


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

  1. Placez un point d’arrêt juste après que le pilote a appelé IoCreateDevice. Obtenez l’adresse DeviceObject .

  2. 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.

  3. 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" 
    
  4. Utilisez g (Go). Le débogueur génère un journal.

  5. 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.)