Erreurs dans la gestion des opérations de nettoyage et de fermeture
Certains pilotes ne parviennent pas à distinguer les tâches requises dans les routines DispatchCleanup et DispatchClose . Le gestionnaire d’E/S appelle la routine DispatchCleanup d’un pilote lorsque le dernier handle d’un objet de fichier est fermé. La routine DispatchClose est appelée lorsque la dernière référence est publiée à partir de l’objet fichier. Un pilote ne doit pas tenter de libérer des ressources dans sa routine DispatchCleanup qui sont attachées à un objet de fichier ou qui peuvent être utilisées par d’autres routines DispatchXxx.
Lors de l’appel de routines de répartition, le gestionnaire d’E/S contient une référence à l’objet de fichier pour les appels d’E/S normaux. Par conséquent, un pilote peut recevoir des demandes d’E/S pour un objet de fichier après que sa routine DispatchCleanup a été appelée, mais avant que sa routine DispatchClose soit appelée. Par exemple, un appelant en mode utilisateur peut fermer le handle de fichier pendant qu’une demande de gestionnaire d’E/S est en cours à partir d’un autre thread. Si le pilote a supprimé ou libéré les ressources nécessaires avant que le gestionnaire d’E/S appelle sa routine DispatchClose, des références de pointeur non valides et d’autres problèmes peuvent se produire.