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