Virtual DLLの仕組みは?
非常に重要な役割を担うVirtual DLLだが、その仕組みに関しては、マイクロソフトのドキュメントでも詳しく説明されていない。しかし、セキュリティーソフトメーカーのマカフィーが公開している「McAfee Labs Blog」 にて、解析の結果が詳細に解説されている。そこで本稿では同社の許可を得て、同ブログの内容を元にVirtual DLLの動作を解説してみる。
まず、APIセットのリスト(スキーマー)は、「Apisetschema.dll」に実装されている。OSカーネルは起動時に、このスキーマーを各プロセスにマッピングする。
![]() | Virtual DLLからLogical DLL(実際のDLL)へのマッピングは、システムドライブのWindows¥system32(32bit版Windows 7の場合)にあるapisetschema.dll内部にマッピングデータが実装されている |
|---|
DLLの依存関係を確認できるツール「Dependency Walker」でWindows 7のKernel32.dllを調べてみると、Kernel32.dllは「Kernelbase.dll」と「api-ms-win-XXXX.dll」というDLLにリンクしていることがわかる。このapi-ms-win-XXXX.dllが、MinWinのDLLの実体である。
![]() | 「Dependency Walker」で解析したKernel32.dll。左上部のウィンドウにKernelbase.dllとapi-ms.win-XXXX.dllというDLLが並んでいる。Kernel32はこれらのDLLにジャンプしているだけ(McAfee Labs Blogより引用、以下同) |
|---|
例えば、「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を返しているだけということもわかった。
![]() | 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にマッピングしている。
![]() | ![]() | |
|---|---|---|
| api-ms-win-core-synch-l1-1-0!OpenProcessを逆アセンブルすると、OpenProcess API自体がエクスポート・エントリーとして登録されている | デバッガーでトレースすると、Kernel32!OpenProcessからKernelbase!OpenProcessにジャンプしている |
Windows 7ではこういった複雑な仕組みを用意することで、APIとDLLの依存関係を排除し、カーネルを進化させても、既存のAPIには悪影響が出ないように互換性を保てるようになった。その意味では、Windows 7のMinWinはVistaカーネルベースと言っても、内部的にはまったく新しいカーネルと言える。
また、Windows 7でこのような仕組みを採用することで、今後はカーネルをチューンナップしたり、新しい機能を入れたとしても、上位のVirtual DLL部分で今までのAPIとの互換性を保つことが可能になる。MinWinとVirtual DLLの採用は、今後のWindowsカーネルにおける大きなターニングポイントとなるだろう。
この連載の記事
- 第23回 なぜWindows 7のカーネルはVistaより軽量化できたのか?
- 第22回 周辺機器を使いやすくするDevice Stageの利点と問題点
- 第21回 Windowsの画面表示を変えるDirect2DとDirectWrite
- 第20回 GPGPUをWindowsでサポートする「DirectCompute」
- 第19回 SSDサポートにさらなる一歩を踏み出したWindows 7
- 第18回 32bitアプリを64bit Windows 7で動かす「WOW64」
- 第17回 パブリックベータが開始された「Office 2010」
- 第16回 Internet Explorer 9のデモが公開 PDC09レポート1
- 第15回 Windows 7の目立たぬ新機能 センサー機能とは何か?
- 第14回 XPユーザーへの最後の手段「XP Mode」の導入と実際
- この連載の一覧へ



















