Windowsの 互換モード は内部的にどのように機能しますか?
互換性モードは、いわゆるシムを使用して実現されます。これらがどのように機能するかを説明する優れた TechNetの記事 があります。
Windowsアプリケーションファイルには、アプリケーションがどのDLLを必要とし、どのDLLから使用するかをアプリケーションローダーに伝えるインポートテーブルが含まれています。たとえば、プロセスはkernel32.dll
のGetVersionEx
を参照する場合があります。プログラムが互換モードで実行される場合、shimはアプリケーションの間に置かれ、shimはGetVersionEx
関数を置き換えます。これにより、アプリケーションはGetVersionEx
をkernel32.dll
から呼び出さなくなりますが、シムのGetVersionEx
シム機能は、以前のバージョンのWindowsの動作を実装します。 GetVersionEx
は簡単なサンプルです。Windowsの各バージョンはGetVersionEx
に独自のバージョン番号を返します。そのため、古いWindowsを偽装すると、GetVersionEx
関数はWindows 7のバージョン番号を返さなくなりますが、たとえば、Windows XPバージョン番号です。したがって、アプリケーションはWindows XP上で実行されていると信じます。
WindowsバージョンからWindowsバージョンへの他の変更もいくつかあります。たとえば、古いバージョンでは、プログラムがDLLをロードした場合、DLLの検索パスにも現在のディレクトリが含まれていました。これはセキュリティ上の問題であるため、新しいバージョンのWindowsではデフォルトで現在のディレクトリを検索します。適切なシムを使用すると、古い動作をシミュレートできます。
シムはアプリケーションとWindows APIの間の単なるレイヤーであるため、シムはアプリケーションが実行できることを実行できます。シムを使用して、UACを回避したり、保護されたファイルにアクセスしたりすることはできません。
詳細を知りたい場合は、以下のリンクをご覧ください。
特にMicrosoft Application Compatibility Toolkitは一見の価値があります。このツールは、既知の問題のあるアプリケーションの概要、利用可能なすべての互換性フィックスとモード、および各アプリケーションに適用されるフィックスを提供します。
いろいろなことが起こると思います。簡単な例は、プログラムがWindowsのバージョンをチェックする場合がありますが、新しいオペレーティングシステムの戻り値に混乱する場合です。したがって、互換モードを使用すると、Windowsに間違ったバージョンを報告するように指示します。 Raymond Chenはさらにいくつかのことについて言及しています: http://blogs.msdn.com/oldnewthing/archive/2003/12/23/45481.aspx#4559
互換モードについての私の知識は、それがいくつかのWindowsシステムコールをプログラムに偽装させることです。
1つの明白な例は、関数 GetVersionEx および GetVersion であり、実際のバージョンではなく、指定されたWindowsバージョンを報告します。
互換モードのプログラムが既知のシステムフォルダ内のファイルを参照すると、古いスタイルのファイルパスも自動的に変換されます。たとえば、Windows 7でXP互換モードのプログラムを実行している場合、C:\Documents and Settings
はC:\Users\<user>\Documents
に変換されます。