Windows-Vertraulichkeit: EmulateHeap-Kompatibilität

Raymond Chen

Einer der äußerst einfach – noch vollständig verrückte – Kompatibilität Verhaltensweisen zur Verfügung, in der Anwendungskompatibilitäts-Toolkit wird EmulateHeap aufgerufen. 

Dieser Kompatibilitätspatch auf einen Prozess aktivieren und dann alle Betriebssystemebene Heap (von HeapCreate zu LocalLock zu GlobalReAlloc und überall in zwischen) Funktionen werden zur Ersatz-Funktionen umgeleitet, die den Windows 95-Heap auf das letzte Detail emulieren.

Beispielsweise könnten Sie ein Programm verfügen, das weist zwei Blöcke des Speichers, beide freigibt, dann reserviert einen Speicherblock, der der dritten und stützt sich auf die Tatsache, dass durch die dritte Reservierung zurückgegebene Zeiger numerisch identisch mit dem Mauszeiger zurückgegeben, die für die erste Zuweisung ist, was geschieht, unter Windows 95.

Möglicherweise verfügen Sie ein Programm, das einen Heap Puffer überläuft und weist keine schwerwiegenden Folgen, da der Speicher, der nach der Heap-Puffers kommt nicht für alles oder zumindest verwendet wird, die unter Windows 95 geschieht.

Sie führen möglicherweise auch aus ein Programm, das gibt Arbeitsspeicher frei, und greift auf freigegebenen Speicher einige Zeit später wird erwartet, dass der Speicher noch immer die Werte enthalten, die bei der es freigegeben wurde und für einige andere Speicherreservierung wiederverwendet wurde noch nicht oder ist nicht mindestens auf Windows 95 wiederverwendet. (Oder sogar schwieriger, das Programm auf die Tatsache beruht, die die Werte, nachdem Sie den Speicher ändern wurde freigegeben, sehr bestimmte Weise!)

Es gibt eine ganze Reihe von sehr klein wenig seltsam Abhängigkeiten wie folgt in älteren Anwendungen. Diese Anwendungen wurden nicht codiert, Art und Weise absichtlich; diese Verhaltensweisen wurden nur wenig Fehlern, die hier und da verstreut, Fehler, die Programme verwaltet werden, um sofort mit abgerufen werden, da Sie nicht zu Problemen, die Ausführung in Verbindung mit dem Windows 95-Heap-Manager führen passiert ist. Und dann Wenn diese Programme auf einer anderen Version von Windows ausgeführt werden, Sie abstürzen da diese Versionen von Windows eine andere Heap-Manager haben.

Dies nicht nehmen Sie nun den Heap-Manager von Windows 95 “ besser ” oder “ stabilere ” als andere. Es ist nur verschiedene. Es gibt wahrscheinlich genauso viele Verhaltensweisen, die Verwaltung zu überstehen, ohne Sie zu Windows 7, die unter Windows 95 abgestürzt würde abstürzt. Die Auswirkungen, die Sie angezeigt werden, ist nur Self-selection: Wenn Sie ein Programm in 1995 geschrieben, die einen Fehler aufgetreten ist, der unter Windows 95 ist abgestürzt haben, würden Sie feststellen und beheben, da Windows 95 die Zielplattform wurde!

Wenn die EmulateHeap-Kompatibilitätspatch für einen Prozess aktiviert ist, ist der Heap-Manager-Verhalten geändert, so dass es alle Sterne mit genau der Anordnung richtet 1995 wiederhergestellt. Alle Coincidences, die unter Windows 95 aufgetreten sind – diese Coincidences, die Anwendungen auf unwissentlich verlassen wurden – sind noch einmal gezwungen, die auftreten, so dass die Anwendungen, die mit diesen Typen von Fehlern auf dieselbe Weise ausführen vor weiterhin würden. Dass Sie bedeutet erzwingen alle Coincidences um Zeile nach oben auch, dass neue Heap-Features wie z. B. geringer Fragmentierung deaktiviert werden müssen, da diese Features die Coincidences verschoben würde, denen von Anwendungen abhängig waren.

Wird den einfachen Teil erläutert.

Der Grund ist dies auch Verrücktes: Die Art und Weise der Anwendungskompatibilität, die Leute verwaltet der Heap-Manager von Windows 95 so perfekt emulieren wird benötigt, dass Sie einfach eine Kopie des Quellcodes von Windows 95-Heap-Manager hat es kompiliert und die Kompatibilität Infrastruktur hinzugefügt. Das heißt, ist eine Kopie ein erheblichen Teil der Windows 95-Kernel in das Windows-Anwendungsframework Kompatibilität. Nicht ganz auf eine gesamte Kopieren von Microsoft Bob, aber in diesem Fall der Abschnitt des Codes, die von Windows 95 unverändert transformiert ist mehr als Ballast; Wenn die EmulateHeap-Kompatibilitätspatch auf einen Prozess aktiviert ist, dass die alten Code von der Festplatte geladen ruft und tatsächliche Arbeit beginnt!

Windows 7 ist ein neues Fault Tolerant Heap-Subsystem, das versucht, viele Klassen von einfachen Heap Speicher Anwendungsfehler zu erkennen und Schutzmaßnahmen automatisch angewendet. Zum Beispiel der Fault Tolerant Heap erkennt und behebt Double freigibt, Heap Puffers übersteigen (mindestens kleine Überläufe) und nach der Freigabe von es unter Verwendung von Arbeitsspeicher (mindestens Wenn Sie nur kurze Zeit, verwenden nachdem Sie ihn freigeben). Es bleibt zu hoffen, bedeutet diese allgemeinere Lösungen die nächste Version von Windows nicht um eine Kopie von Windows 7 Heap-Manager, innerhalb dessen Kompatibilität Infrastruktur Dateien übertragen muss.

Raymond Chen * Website The Old New Thing und identisch Buch (Addison-Wesley, 2007), betreffen Windows Verlauf, Win32-Programmierung und seine Zune Kopfhörer versehentlich zerstören.*

Verwandter Inhalt