[基礎解説]
Windowsの互換性テクノロジの仕組み(前編)

2.Windows 7との互換性を確保する「shim」

佐藤 芳樹
2010/06/17
Page1 Page2 Page3

互換モードとshimの関係

Windows 7新時代「Windows XP → 7移行のアプリケーション・トラブル解決法

 ここでWindows 7に標準搭載されている「互換モード」という機能の裏側の仕組みを例に、shimの実際の動きを説明しておく(互換モードの使い方については関連記事を参照)。Windows 7の互換モードとは、下位バージョンのWindows OSをエミュレートするための機能である。この互換モードの設定を「Windows XP (Service Pack 2)」に設定すると、Windows 7の裏側でWindows XP Service Pack 2を偽装するための合計19個のshimが対象アプリケーションに設定される。これにより、本来はWindows 7で動かないはずのWindows XP Service Pack 2用アプリケーションを実行できるようになる。

Windows 7の互換モードの設定
これはWindows 7で、ある実行ファイルのプロパティを開いて[互換性]タブを選択したところ。
古いWindows OSをエミュレートする「互換モード」の設定メニュー。

 この互換モードで有効になるshimを次の表に挙げておく。単にバージョン番号を偽装するだけでなく、アクセス権やAPIなどに関する仕様を、以前のOSの場合と同じになるように変更したりもしている。

shim名 機能の概要
AdditiveRunAsHighest 利用可能な最も高いトークンにアプリケーションを昇格する。現在のコンテキストがまだ昇格されておらず、昇格済みのリンクされたトークンが存在する場合は、UACの昇格確認ダイアログ・ボックスが表示される。ユーザーが所有するトークンが1つだけの場合(標準ユーザー用のトークン、またはUACが無効な場合のトークン)は、現在のコンテキストが使用される。また、インストーラの検出とマニフェストの処理を無効にし、適用後にアプリケーション全体の昇格の状態を判断する
DirectXVesrionLie 特定のバージョンのパラメータを返すように、DXDIAGN GetProp APIをフックする。コマンドラインには、「<MAJORVERSION>.<MINERVERSION>.<LETTER>」の形式でバージョンが渡される(例:「9.0.c」)
ElevateCreateProcess 管理者特権でアプリケーションを起動することにより、CreateProcessのERROR_ELEVATION_REQUIREDを処理する
EmulateSorting CompareString、LCMapString、およびIsNLSDefinedStringの各APIでWindows Server 2003の並べ替え動作を有効にする
EnableLegacyException
HandinginOLE
ole32を以前の例外処理動作に戻す
FailObsoleteShellAPIs アプリケーションによっては、ほかのAPIによってサポートされていない古いプライベートshell32 APIを呼び出す場合がある。このshimを適用すると、失敗したスタブのある関数が実装される。この方式で処理されるのは、FileMenu_*関数に加え、Windows XPとWindows Vistaの間に使われなくなった関数である
FaultTolerantHeap 小規模なバッファ・オーバーランや二重解放などヒープ・メモリの破損に対する最も一般的な原因を軽減する
GlobalMemory
Status2GB
ページ・ファイルと物理メモリの状態を修正して、2Gbytes以内の使用可能なページ・ファイルと物理メモリを報告する
HandleBadPtr InternetSetOptionAおよびInternetSetOptionW関数からlpBuffer検証を使用できるようにサポートし、追加のパラメータ検証が実行できるようにする
HardwareAudioMixer オーディオ・ハードウェア・インフォメーションをレポートするためにMultimedia APIをセットする
shim名 機能の概要
LoadLibraryCWD 現在のディレクトリから最初に読み込むことにより、従来の動作のエミュレートが試行される
NoGhost アプリケーションで、ウィンドウの非実体化が行われないようにする
RedirectBDE レガシーのBorland Database Engineアプリケーションを修正するための変更をc:\pdoxusrs.netに書き込む
RedirectMP3Codec このshimは、以前のMP3コーデックを直接CoCreateInstanceし、それをDirectShow graphのフィルタとして使用するアプリケーション用である。この方法は、フィルタの取得方法としてサポートされていない。また、欠落フィルタに対するCoCreateInstanceをインターセプトし、サポートされているものにリダイレクトする
SyncSystemAnd
System32
ファイル名のセミコロン区切りコマンドラインを取得する。プロセスの終了時に、DLLはコマンドラインから各ファイル名を抽出し、ファイルがSystemディレクトリまたはSystem32ディレクトリのいずれかに存在する場合、もう一方のディレクトリにも同じファイルが存在することを確認する。一部の古いアプリケーションでは、NT環境で特定のDLLがSystem32ディレクトリに存在する場合、Systemディレクトリにも同じDLLが存在するという設定になっている(逆の場合も同様)
VirtualRegistry すべてのレジストリ関数をフックして、仮想キー、リダイレクト、および拡張値を許可する
WinXPSP2VersionLie GetVersion APIとGetVersionEx APIをフックして、Windows XP Service Pack 2バージョンの資格情報を返す
WRPDllRegister コマンドラインで指定された登録中のDLLまたはシステム付属のDLLをスキップする
WRPMitigation Windowリソース保護(WRP、後述のコラム参照)によって保護されたファイルでAccessCheck返送が完了する
Windows XP Service Pack 2互換モードを構成する19個のshim

Windows 7への移行に効果的なshim
  そのほか、Windows XPからWindows 7へ移行する際に効果を発揮するshimについてもいくつか紹介する。

Vistaの地平「第7回 管理者権限での実行を制限するユーザー・アカウント制御UAC(前編)

 Windows XPからWindows 7へ移行する際に互換性問題が生じやすい最大の原因としては、ユーザー・アカウント制御(UAC)と呼ばれるセキュリティ対策機能が挙げられる。UACが有効な環境では、コンピュータの動作に影響する可能性がある操作や、ほかのユーザーに影響する設定を変更する操作が実行される前に、ユーザーに許可を求めるか、管理者パスワードの入力を求められる。

 Windows XPの場合、管理者ユーザーの下では、アプリケーションは常に管理者権限で動作していた。しかしWindows 7では、管理者ユーザーであっても普段は標準ユーザー権限でアプリケーションを実行し、UACを介して権限を昇格した場合のみアプリケーションを管理者権限で実行できる。そのため、管理者権限を必要とする従来の(UAC非対応の)アプリケーションは、実行途中で動作を止められてしまう可能性がある。

 このようなUACの挙動に対して効果的なshimのうち、代表的なものを下表で紹介する。

shim名 機能の概要
ElevateCreateProcess 管理者特権でアプリケーションを起動することにより、CreateProcessのERROR_ELEVATION_REQUIREDを処理する
ForceAdminAccess アプリケーションが各種のAPI呼び出しを使用して、現在のユーザーがAdministratorsグループに属しているかどうかを確認する際に発生する問題を修正する
LocalMappedObject すべてのGlobal名前付きファイル・マッピング・オブジェクトを、Local名前空間に強制的に配置する
RunAsHighest このshimにより、このアプリケーションは、ユーザーが使用可能な最も高い特権のセキュリティ・コンテキストで実行されるとマークされる。つまり、標準ユーザーの場合は標準ユーザー特権、また管理者の場合は管理者特権で実行されることを意味する
NoVirtualization アプリケーションのファイルおよびレジストリの仮想化をオフにする
VirtualizeDeleteFile DeleteFile呼び出しを仮想化する。アプリケーションが作成するこの呼び出しは、ほかのファイルAPIをフックし、削除されたファイルの仮想化を行う
VirtualizeHKCRLite HKEY_CLASSES_ROOTへの書き込み呼び出しをHKEY_CURRENT_USERS\Software\Classesへリダイレクトする
VirtualRegistory すべてのレジストリ関数をフックして、仮想キー、リダイレクト、および拡張値を許可する
ユーザー・アカウント制御(UAC)に対応するためのshim

 上記と同様に、Windowsリソース保護(WRP、後述のコラム参照)など、Windows Vista/Windows 7でシステム保護の仕組みが変更された影響についてもshimが用意されており、その互換性問題を回避できる。

shim名 内容
WRPDllRegister コマンドラインで指定された登録中のDLLまたはシステム付属のDLLをスキップする
WRPMitigation WRPで保護されたファイルでAccessCheck返送を完了する
WRPRegDeleteKey WRPで保護されたキーを擬似的に削除する
Windowsリソース保護(WRP)に対応するためのshim

 このようにさまざまなshimを活用することにより、Windows XPとWindows 7の間で生じるアプリケーションの互換性問題を、プログラムのソース・コードを改修することなく、効率よく回避できる。なお、実際に個々のshimを組み合わせたり、アプリケーションに適用したりする方法・手順などについては、後編で解説する。

【コラム】Windowsリソース保護(WRP)とは?

 Windowsリソース保護(WRP:Windows Resource Protection)とはWindows Vista以降のWindows OSに実装された機能で、OSが使用しているシステム・ファイルやフォルダ、レジストリなどのWindowsのリソースやコンポーネントを、読み取り専用で保護する。

 Windows Vista/Windows 7ではWRPにより、Windowsリソース/コンポーネントに対して、管理者ユーザーであっても読み取りと実行権限しか与えられていない。一方、Windows XPなどの古いWindows OSでは、管理者ユーザーにフルコントロール権限が与えられている。そのため、古いアプリケーションでWindowsリソース/コンポーネントへのアクセスを必要とするものは、Windows 7上ではWRPによって正しく実行できない可能性がある。

Windows XPにおけるカーネル・ファイル(ntoskrnl.exe)のアクセス権
管理者ユーザーやローカル・システム・アカウントにフルコントロール権限が与えられている。

Windows 7におけるカーネル・ファイル(ntoskrnl.exe)のアクセス権
管理者ユーザーやローカル・システム・アカウントであっても、読み取りと実行権限しか与えられていない。

 次のページでは、Windows互換性テクノロジが互換性問題の解決に効果を発揮する場面や、そのほかの技術との使い分けについて解説する。


 INDEX
  [基礎解説]Windowsの互換性テクノロジの仕組み(前編)
    1.互換性問題が生じるワケ
  2.Windows 7との互換性を確保する「shim」
    3.互換性テクノロジが効果を発揮する場面
 
  [基礎解説]Windowsの互換性テクノロジの仕組み(後編)
    1.Application Compatibility Toolkit(ACT)とは?
    2.ACTで「互換性データベース」を作る
    3.Windows互換性テクノロジの限界と活用

 基礎解説

 「Windows XP→Windows 7移行支援記事集」



Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間