[基礎解説] Windowsの互換性テクノロジの仕組み(前編) 2.Windows 7との互換性を確保する「shim」 佐藤 芳樹2010/06/17 | |
|
■互換モードとshimの関係
|
ここで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で、ある実行ファイルのプロパティを開いて[互換性]タブを選択したところ。 | |||
|
この互換モードで有効になる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についてもいくつか紹介する。
|
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互換性テクノロジが互換性問題の解決に効果を発揮する場面や、そのほかの技術との使い分けについて解説する。
INDEX | ||
[基礎解説]Windowsの互換性テクノロジの仕組み(前編) | ||
1.互換性問題が生じるワケ | ||
2.Windows 7との互換性を確保する「shim」 | ||
3.互換性テクノロジが効果を発揮する場面 | ||
[基礎解説]Windowsの互換性テクノロジの仕組み(後編) | ||
1.Application Compatibility Toolkit(ACT)とは? | ||
2.ACTで「互換性データベース」を作る | ||
3.Windows互換性テクノロジの限界と活用 | ||
基礎解説 |
「Windows XP→Windows 7移行支援記事集」 |
- Azure Web Appsの中を「コンソール」や「シェル」でのぞいてみる (2017/7/27)
AzureのWeb Appsはどのような仕組みで動いているのか、オンプレミスのWindows OSと何が違うのか、などをちょっと探訪してみよう - Azure Storage ExplorerでStorageを手軽に操作する (2017/7/24)
エクスプローラのような感覚でAzure Storageにアクセスできる無償ツール「Azure Storage Explorer」。いざというときに使えるよう、事前にセットアップしておこう - Win 10でキーボード配列が誤認識された場合の対処 (2017/7/21)
キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。英語キーボードが日本語配列として認識された場合などは、正しいキー配列に設定し直そう - Azure Web AppsでWordPressをインストールしてみる (2017/7/20)
これまでのIaaSに続き、Azureの大きな特徴といえるPaaSサービス、Azure App Serviceを試してみた! まずはWordPressをインストールしてみる
|
|