Introduction

L'équipe responsable de shell32.dll a reçu un rapport de bogue indiquant que le module était à l'origine d'un grand nombre de plantages dans un programme tiers. L'analyse des dumps de mémoire a révélé des signes clairs d'une surcharge de pile.

Contexte Technique

La surcharge de pile était due à un cercle vicieux de gestion d'exceptions. Une exception s'est produite, et le noyau a décidé de la renvoyer en mode utilisateur pour un traitement supplémentaire. Lors de la recherche du gestionnaire d'exceptions à appeler, une autre exception s'est produite, ce qui a redémarré la boucle d'exceptions.

La pile a fini par être épuisée, ce qui a provoqué une exception de surcharge de pile qui a terminé le processus. Le bogue a été attribué à shell32 car il semblait que shell32 était à l'origine de l'exception initiale.

Analyse et Implications

L'analyse de la pile a montré que le bloc de cadres de pile se répétait longtemps, indiquant un cercle vicieux de gestion d'exceptions. Le bloc de cadres de pile s'est arrêté à la source de la première exception : combase!CoTaskMemFree.

L'enregistrement d'exception et le contexte d'enregistrement ont probablement été passés à RtlDispatchException. L'enregistrement d'exception commence par le code d'exception, suivi de l'adresse de code où l'exception a été prise.

Perspective

Il est important de noter que la mémoire qui contient la fonction CoTaskMemFree a été libérée. Cela signifie que le module combase.dll n'était pas présent en mémoire, malgré le fait qu'il n'ait pas été déchargé formellement.

Ceci met en évidence l'importance de la gestion de la mémoire et des exceptions dans les programmes. Il est essentiel de s'assurer que les modules sont correctement chargés et déchargés, et que les exceptions sont gérées de manière appropriée pour éviter les cercles vicieux de gestion d'exceptions.