Virtual DLLの仕組みは?
非常に重要な役割を担うVirtual DLLだが、その仕組みに関しては、マイクロソフトのドキュメントでも詳しく説明されていない。しかし、セキュリティーソフトメーカーのマカフィーが公開している「McAfee Labs Blog」 にて、解析の結果が詳細に解説されている。そこで本稿では同社の許可を得て、同ブログの内容を元にVirtual DLLの動作を解説してみる。
まず、APIセットのリスト(スキーマー)は、「Apisetschema.dll」に実装されている。OSカーネルは起動時に、このスキーマーを各プロセスにマッピングする。
DLLの依存関係を確認できるツール「Dependency Walker」でWindows 7のKernel32.dllを調べてみると、Kernel32.dllは「Kernelbase.dll」と「api-ms-win-XXXX.dll」というDLLにリンクしていることがわかる。このapi-ms-win-XXXX.dllが、MinWinのDLLの実体である。
例えば、「api-ms-win-core-processthreads-l1-1-0.dll」はプロセス/スレッド関係APIのDLLで、「api-ms-win-core-heap-l1-1-0.dll」はユーザーモード/ヒープ管理関係APIのDLLだ。ちなみにDLL名の数字は、以下のような構造になっている。
- L[System Layer]-[API Major Ver]-[API Minor Ver]
「api-ms-win-core-heap-l1-1-0.dll」なら、「ユーザーモード/ヒープ管理関係」で「Layer1」(最も基本部分)に位置し、APIバージョンとしては「1.0」という意味になる。
Kernel32.dllの動作を逆アセンブラで追っていくと、「Kernel32!OpenProcess」は内部でほとんど処理をせず、「api-ms-win-core-synch-l1-1-0.dll」内部の「OpenProcess_0」へジャンプしていることがわかる。さらに、「api-ms-win-core-synch-l1-1-0!OpenProcess」を逆アセンブルしてみると、この関数が実は空で、単に0を返しているだけということもわかった。
2つとも実際は何もしていないのに、どうやって正しい処理が実現されるのかと言えば、DLLロード処理内部に秘密がある。Kernel32!OpenProcessを実行すると、OpenProcess中のインポート・テーブル・エントリー(ジャンプ先リスト)を参照して、Kernelbase!OpenProcessにジャンプする。さらにKernelbase!OpenProcessの中では、実際のOpneProcessのコードとして「Ntdll!ZwOpenProcess」が実行される。
そのため、Kernel32!OpenProcessを実行中している最中は、api-ms-win-core-synch-l1-1-0!OpenProcessへはジャンプしないし、実行中のアドレス空間にロードもしない。このような仕掛けで、Vista APIをMinWinのAPIにマッピングしている。
Windows 7ではこういった複雑な仕組みを用意することで、APIとDLLの依存関係を排除し、カーネルを進化させても、既存のAPIには悪影響が出ないように互換性を保てるようになった。その意味では、Windows 7のMinWinはVistaカーネルベースと言っても、内部的にはまったく新しいカーネルと言える。
また、Windows 7でこのような仕組みを採用することで、今後はカーネルをチューンナップしたり、新しい機能を入れたとしても、上位のVirtual DLL部分で今までのAPIとの互換性を保つことが可能になる。MinWinとVirtual DLLの採用は、今後のWindowsカーネルにおける大きなターニングポイントとなるだろう。

この連載の記事
-
第50回
PC
次期IE「Internet Explorer 10」プレビュー版が公開 -
第49回
PC
RTM版も登場 Windows Home Server 2011の変更点とは -
第48回
PC
5秒で起動するSplashtop OSを自作パソコンで試す -
第47回
PC
ベンチで検証 Internet Explorer 9 RCの互換性と性能 -
第46回
PC
正式版の直前となるInternet Explorer 9 RC版が登場 -
第45回
PC
Silverlightをさらに進化させる「Silverlight 5」 -
第44回
PC
「Windows on ARM」が持つ意味と課題は何か? -
第43回
PC
GPUを利用できる仮想化ソフト XenClient 実践編 -
第42回
PC
複数のWindowsを使い分ける仮想化ソフト XenClient -
第41回
PC
3秒で起動しWindowsと共存するOS「Splashtop OS」 -
第40回
PC
最新版「PP7」に見るIE9の性能と互換性の高さ - この連載の一覧へ