知識マップ: レジストリの32bit/64bitリダイレクトと仮想化の落とし穴 ── Wow6432Nodeと「書いたはずの値がない」問題

記事「レジストリの32bit/64bitリダイレクトと仮想化の落とし穴 ── Wow6432Nodeと「書いたはずの値がない」問題」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

64bit Windowsの32bitプロセスがHKLM\Softwareへアクセスすると、WOW64のレジストリリダイレクターが物理位置Wow6432Nodeへ透過的に誘導し、この振り分けはビットネスの話として読み書きの両方に効く。別ビューへは.NETのRegistryViewやWin32のKEY_WOW64_64KEY/32KEY、reg.exeの/reg:64・/reg:32という公式手段で明示的にアクセスすべきで、パスの直書きは将来変更され得るため避ける必要がある。管理者権限のない32bit対話型プロセスがHKLM\Softwareへ書き込むと、権限の話であるUACレジストリ仮想化によりVirtualStoreへ黙って転送され、requestedExecutionLevelを指定したプロセスはこの仮想化の対象外になる。COMのCLSID登録もビューごとに分離されるため、bitnessの不一致は0x80040154エラーの定番原因になり、実際にどこを読み書きしたかはProcmonの物理パスで確定させるのが最短である。

レジストリのリダイレクトと仮想化の知識マップWOW64レジストリリダイレクターがbitnessに応じてWow6432Nodeへ読み書きを振り分けること、UACレジストリ仮想化が権限不足の書き込みをVirtualStoreへ転送すること、両者の違いとビューを明示するAPI、COM登録やインストーラーで起きる実害とProcmonによる確認手段を示す図利用する利用するで構成できるで構成できるで構成できる利用する防止する内容を継承する原因になり得る原因になり得るに保存される利用する防止する防止する軽減するで確認できるで確認できるで確認できるで確認できるレジストリリダイレクターUACレジストリ仮想化WOW64(Windows 32-bit on Windows 64-bit)WOW6432Node.NET RegistryView列挙体KEY_WOW64_64KEY/KEY_WOW64_32KEYreg.exeの/reg:64 /reg:32VirtualStorerequestedExecutionLevel(実行レベル宣言)インストーラーとアプリのbitness不一致0x80040154(Class not registered)CLSID(Class ID)regsvr32Wow6432Nodeパスの直書きProcess Monitor(procmon.exe)

概念間の関係(全19件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

レジストリリダイレクター
32bitプロセスと64bitプロセスに別々の論理ビューを見せ、同じキー名へのアクセスを異なる物理位置へ透過的に振り分けるWOW64の仕組み。
UACレジストリ仮想化
書き込み権限のない32bit対話型プロセスによるHKLM\Software配下への書き込みを、ユーザーごとの仮想ストアへ黙って転送するVista以降の互換技術。
WOW64(Windows 32-bit on Windows 64-bit)
64bit Windowsが32bitアプリを実行するためのサブシステムで、レジストリやファイルシステムへのアクセスを透過的にリダイレクトする。
requestedExecutionLevel(実行レベル宣言)
アプリケーションマニフェストで宣言する、asInvoker・highestAvailable・requireAdministratorのいずれかの起動時権限レベルである。
VirtualStore
UACレジストリ仮想化によって転送された書き込みが格納される、ユーザーごとの仮想ストア(HKEY_USERS\<SID>_Classes\VirtualStore\Machine\Software)。
CLSID(Class ID)
COMコンポーネントの実装(クラス)を一意に指すGUID。レジストリ上の登録の鍵になる識別子。
regsvr32
DLLやOCXなどのCOMコンポーネントをレジストリへ登録・登録解除するコマンドラインツール。
.NET RegistryView列挙体
RegistryKey.OpenBaseKeyに渡し、Registry64/Registry32/Defaultでアクセスするレジストリビューを明示する.NETの列挙体。
KEY_WOW64_64KEY/KEY_WOW64_32KEY
RegOpenKeyExなどのsamDesiredに指定し、Win32 APIから明示的に64bit/32bitビューへアクセスするためのアクセス権フラグ。
インストーラーとアプリのbitness不一致
インストーラーとアプリ本体で書き込み・読み取りのレジストリビュー(bitness)が揃っていないために、書いたはずの設定値が読めない問題。
0x80040154(Class not registered)
公式にはREGDB_E_CLASSNOTREGと呼ばれるCOMのエラーで、完全な未登録だけでなく、別ビット数側のレジストリviewにだけ登録されている場合や、そのユーザーにしか見えないHKCU側にだけ登録されている場合にも起きる。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。