Confidencial de Windows: Recuerdos del pasado con EmulateHeap

Raymond Chen

Uno de muy sencillo: aún totalmente loco: comportamientos de compatibilidad disponibles en el Toolkit de compatibilidad de aplicaciones se denomina EmulateHeap. 

Si habilita esta corrección de compatibilidad en un proceso, a continuación, el montón de nivel de sistema operativo funciona (desde HeapCreate para LocalLock GlobalReAlloc a todo el mundo entre) se redirigen a las funciones de reemplazo que emulan el montón de Windows 95 el último detalle.

Por ejemplo, podría tener un programa que asigna dos bloques de memoria, los dos libera, asigna un bloque tercero de memoria y se basa en el hecho de que el puntero devuelto por la asignación de tercera es numéricamente idéntico al puntero devuelto por la primera asignación, ya que es lo que sucede en Windows 95.

Puede tener un programa que desborda un búfer de montón y se resiente sin consecuencias graves porque la memoria que viene después el búfer de montón no se utiliza para cualquier cosa o al menos, que es lo que sucede en Windows 95.

Es posible que también se ejecutando un programa que libera la memoria y, a continuación, tiene acceso a la memoria liberada poco después, se espera que la memoria todavía contendrá los valores que tenía cuando se ha liberado y ha no volver a utilizarse para otra asignación de memoria o al menos no se vuelven a utilizar en Windows 95. (O incluso scarier, que el programa se basa en el hecho de que los valores cambian después de la memoria se liberó de una forma muy específica!)

Hay un montón de diminutos poco raro dependencias como esto en las aplicaciones más antiguas. Estas aplicaciones no se han codificado que cierto intencionadamente; estos comportamientos eran errores simplemente poco dispersos por aquí y allá, los errores que los programas administradas irse con porque ha ocurrido con no causar problemas cuando se ejecuta junto con el administrador del montón de Windows 95. Y, a continuación, cuando estos programas se ejecutan en cualquier otra versión de Windows, bloquean porque esas otras versiones de Windows tienen un administrador de pila diferente.

Ahora, esto no hacer que el administrador del montón de Windows 95 “ mejor ” o “ más robusto ” que otros. Es simplemente diferente. Hay comportamientos probablemente sólo tantos que administran sobrevivir sin bloquearse en Windows 7 han haría se bloqueó en Windows 95. El efecto que está viendo es simplemente self-selection: Si escribió un programa en 1995 tenía un error que se bloqueó en Windows 95, llevaría observe y corregirlo porque Windows 95 era la plataforma de destino!

Cuando la corrección de compatibilidad de EmulateHeap está habilitada en un proceso, se modifica del Administrador de pila en el comportamiento para que alinea todas las estrellas para exactamente las posiciones en que se encontraban en 1995. Todas coincidences que han tenido lugar en Windows 95: esos coincidences aplicaciones eran inconscientemente depender: una vez más están obligados a producirse, por lo que las aplicaciones que contiene estos tipos de errores podrían continúe ejecutándose exactamente del mismo modo que lo hacían antes. Cuenta que, obligar a todos los coincidences a línea hasta también significa que las nuevas funciones de montón, como fragmentación Low deben estar desactivadas, porque esas características haría desplazar coincidences que fueron depender de las aplicaciones.

Que explica la parte sencilla.

El motivo por el que esto es también loco: La forma en que la gente administrado a emular perfectamente por lo tanto, el administrador del montón de Windows 95 de la compatibilidad de aplicaciones es que simplemente realizó una copia del código de origen de administrador del montón de Windows 95, lo vuelve a compilar y agrega a la infraestructura de compatibilidad. En otras palabras, es una copia de una parte significativa del núcleo de Windows 95 en el marco de trabajo de compatibilidad de aplicaciones para Windows. No bastante toda una copia de Microsoft Bob, pero en este caso, el fragmento de código elevada intacto desde Windows 95 es más de lastre; si la corrección de compatibilidad de EmulateHeap está habilitada en un proceso que código ancestrales obtiene cargado desde la unidad de disco duro y comienza realizando trabajo real!

7 De Windows tiene un nuevo subsistema de montón tolerante a errores intenta detectar muchas clases de errores de memoria de montón de aplicación sencilla y aplicar las mitigaciones automáticamente. Por ejemplo, se libera de doble error tolerante a errores de pila detecta y corrige, las saturaciones del búfer de montón (mínimo pequeñas saturaciones) y el uso de memoria después de liberarlo (al menos si se utiliza sólo un breve período de tiempo después de que la libre). Con suerte, esta solución más general implica que la próxima versión de Windows no tendrá que incluir una copia del Administrador de pila en el 7 dentro de sus archivos de la infraestructura de compatibilidad.

Raymond Chen * Sitio Web, The Old New Thing y libro titulado idénticamente (Addison-Wesley, 2007), encargarse del historial, programación de Win32 y destruir accidentalmente sus auriculares Zune de Windows.*

Contenido relacionado