Windows Confidential: En remontant le chemin des souvenirs avec EmulateHeap

Raymond Chen

Une des extrêmement simple — encore complètement fou : comportements de compatibilité disponibles dans Shared Computer Toolkit Compatibilité des applications est appelée EmulateHeap. 

Si vous activez ce correctif de compatibilité sur un processus, puis tous les tas au niveau du système d'exploitation fonctionne (à partir de HeapCreate pour LocalLock pour GlobalReAlloc et partout entre les deux) sont redirigés vers des fonctions de remplacement émulent le tas de Windows 95 vers le bas pour le tout dernier détail.

Par exemple, vous pouvez avoir un programme qui alloue deux blocs de mémoire, libère les deux, alloue un bloc de mémoire tiers et s'appuie sur le fait que le pointeur retourné par l'allocation de tiers est numériquement identique au pointeur renvoyé par la première allocation, car c'est ce qui se produit sur Windows 95.

Vous possédez peut-être un programme qui produit un dépassement de capacité sur un tampon de tas et ne souffre aucun des conséquences graves parce que la mémoire qui vient après le tampon de tas n'est pas utilisée pour quoi que ce soit, ou au moins qui est ce qui se produit sur Windows 95.

Vous pouvez également exécuter un programme qui libère la mémoire, puis accède à la mémoire libérée quelque temps plus tard, attendu que la mémoire contiendra toujours les valeurs qui il était au moment où il a été libérée et n'a pas été réutilisée pour certaines autre allocation de mémoire, ou si au moins qu'il n'est pas réutilisé sur Windows 95. (Ou même scarier, que le programme s'appuie sur le fait que les valeurs changent après la mémoire a été libérée de manière très particulière!)

Il existe quelques toute petites dépendances bizarre peu comme suit dans les applications plus anciennes. Ces applications n'ont pas été codées que manière intentionnellement ; ces comportements étaient peu erreurs disséminées ici et là, les erreurs des programmes géré en sortir avec, car ils sont devenus de ne pas entraîner des problèmes lorsque exécutées conjointement avec le Gestionnaire de tas Windows 95. Et puis lorsque ces programmes sont exécutés sur d'autres versions de Windows, ils blocage car les autres versions de Windows ont une gestion des segments de mémoire différents.

Maintenant, cela n'est pas rendre la gestion des segments de mémoire Windows 95 “ mieux ” ou “ plus robuste ” que les autres. Il est juste différent. Il n'y a probablement simplement comme de nombreux comportements qui gèrent à survivre sans blocage sur Windows 7 devrait avoir est tombé en panne sous Windows 95. L'effet que vous voyez est self-selection seulement : Si vous avez écrit un programme en 1995 avait un bogue qui est tombé en panne sous Windows 95, vous devez notez et de le résoudre, car Windows 95 est la plate-forme cible !

Lorsque le correctif de compatibilité EmulateHeap est activé sur un processus, comportement du Gestionnaire de tas est modifié de sorte qu'il aligne toutes les étoiles pour exactement les positions dans que lesquelles elles se trouvaient en 1995. Tous les coincidences s'est produite sur Windows 95 — ces coincidences applications ont été insu fier — sont à nouveau obligés se produisent, afin que les applications qui contient ces types d'erreurs devraient continuer à exécuter d'exactement la même façon ils le faisaient avant. Forçant tous coincidences à ligne jusqu'à signifie également que nouvelles fonctionnalités de tas, telles que la fragmentation Low doivent être désactivées, car ces fonctionnalités seraient décaler coincidences qui ont été fier aux applications.

Qui explique la pièce simple.

La raison pour laquelle qu'il est également fou : La façon dont la gens géré pour émuler le Gestionnaire de tas Windows 95 donc parfaitement la compatibilité des applications qu'ils ont pris simplement une copie du code de source de gestion des segments de mémoire de Windows 95, il recompilé et ajouté à l'infrastructure de compatibilité. En d'autres termes, il existe une copie d'une partie significative du noyau de Windows 95 à l'intérieur de l'infrastructure de compatibilité d'application Windows. Pas vraiment l'intégralité d'une copie de Microsoft Bob, mais dans ce cas, le segment de code levé intactes à partir de Windows 95 est plus de ballast ; si le correctif de compatibilité EmulateHeap est activé sur un processus, que le code ancien obtient chargé à partir du disque dur et commence le travail réel !

Windows 7 a un nouveau sous-système Fault Tolerant tas tente de détecter de nombreuses classes d'erreurs de mémoire de tas application simple et d'appliquer automatiquement les atténuations. Par exemple, libère de double panne à tolérance de tas détecte et corrige les, les saturations de segment de mémoire tampon (au moins petites saturations) et l'utilisation de la mémoire après avoir libéré il (au moins si vous l'utilisez uniquement quelques instants après avoir libéré il). Nous espérons que cette solution plus générale, la prochaine version de Windows n'aurez pas à inclure une copie de la gestion des segments de mémoire Windows 7 à l'intérieur de ses fichiers d'infrastructure de compatibilité.

Raymond Chen * Site Web, The Old New Thing et identique intitulée livre (Addison-Wesley, 2007), traitent Windows de l'historique de, programmation Win32 et détruire accidentellement son casque Zune.*

Contenu associé