Windows 機密:EmulateHeap 回顧
Raymond Chen
其中一個極為簡單 — 尚未完全瘋狂 — 在應用程式相容性工具組中可用的相容性行為稱為 EmulateHeap。
如果您啟用此相容性修正程式上一個程序,然後 (從 LocalLock GlobalReAlloc 並到處都在之間的 HeapCreate) 的所有作業系統層級堆積函都式會被重新導向至模擬 Windows 95 堆積向下至最後一個非常詳細資料的取代函都式。
比方說,您可能必須程式,會配置記憶體的兩個區塊、 釋放它們兩個、 然後配置記憶體的第三個區塊並仰賴第三個配置所傳回指標是以數字等於第一個配置所傳回的指標,因為,’s 怎樣在 Windows 95 上的事實。
您可能有一種程式,造成堆積緩衝區溢位,並降低不嚴重的後果,因為是來自之後堆積緩衝區的記憶體不正如輕,或至少 ’s 怎樣在 Windows 95 上的。
您可能也執行的程式,釋放記憶體,然後存取釋放的記憶體之後的某個時間必須記憶體仍然會包含時它已經釋放並 hasn’t 被重複用於其他某些記憶體配置,或至少它 isn’t 重複使用,在 Windows 95 上的值。 (或甚至 scarier,程式依賴事實,值變更之後,記憶體被釋放非常特定的方式 !)
有一大堆小小怪異像這樣中的相依性較舊的應用程式。 這些應用程式 weren’t 編碼提刻意 ; 這些行為已此處有散佈的只是小錯誤,因為它們剛好不會造成問題搭配使用 Windows 95 堆積管理員的執行時立即取得與管理程式的錯誤。 然後在任何其他版本的 Windows 上執行這些程式時, 它們會墜毀因為這些其他版本的 Windows 具有不同的堆積管理員。
「 好 」 或 「 更健全 」 這 doesn’t 現在,讓 Windows 95 堆積管理員比其他。 ’s 只是不同的。 有可能只是多個管理而不會在 Windows 95 有毀損的 Windows 7 上當機不受影響的行為。 查看的效果是只是 self-selection:如果您必須在 Windows 95 毀損的 Bug 的 1995 年撰寫程式,請注意,並因為 Windows 95 是您的目標平台加以修正!
當處理程序啟用了 EmulateHeap 相容性修正程式時,堆積管理員 ’s 行為被改變,所以對齊確切位置,所以 1995 年的所有顆星。 在 Windows 95 發生的所有巧合 — 那些應用程式不自覺地所依賴的巧合 — 以便包含這類錯誤的應用程式會繼續以完全相同的方式他們以前執行會再次被迫發生。 提醒您強迫到一行的所有巧合向上也表示新的堆積功能,例如低分散必須關閉因為這些功能會移位應用程式所依賴的巧合。
說明簡單的一部份。
這也是瘋子原因:同仁管理因此完全模擬 Windows 95 堆積管理員的應用程式相容性是它們只是花了一份 Windows 95 堆積管理員來源程式碼的方法重新編譯,並加入相容性基礎結構。 亦即 ’s 顯著的區塊的 Windows 95 核心 Windows 應用程式相容性架構內的複本。 不完全對整個複製的 Microsoft 鮑伯但在這種情況下保持不變消除從 Windows 95 的程式碼區塊是一個以上的 ballast ; 如果在一個處理序上啟用 EmulateHeap 相容性修正程式古老的程式碼取得從硬碟機載入,並開始執行實際工時!
Windows 7 有新的 Fault 容錯堆積子系統會嘗試偵測許多類別的簡單應用程式堆積記憶體錯誤,並自動套用緩和措施。 比方說容錯堆積會偵測並更正的錯誤雙精度浮點數釋放、 堆積緩衝區滿溢 (至少小滿溢) 和使用的記憶體釋放它後 (至少如果您使用它只有一段時間後釋放它)。 但願,此更一般的解決方案表示下一版的 Windows won’t 必須包含一份 Windows 7 堆積管理員及其相容性基礎結構檔案內。
Raymond Chen ’s * Web 站台、 [舊的新 Thing 和相同其標題為的書籍 (Addison-Wesley,2007年),處理 Windows 歷程記錄、 Win32 程式設計和意外摧毀他 Zune 頭戴式耳機。*