FAQ:Windows API

Q & A

64bits Windowsで、32bitsアプリからレジストリにアクセスする(FAQ:Windows API)

64bits Windows で32bitsアプリの振る舞いについては別項で詳細に論ずるとして、ここではレジストリへのアクセスについてまとめる。

基本的には特別なことをしなくても、32bits Windows 上と同様に扱うことが出来る。
ただし、それは HKEY_CURRENT_USER 下に関してのことで、それ以外のルートノードに関しては若干の注意が必要。

まず特筆すべきは、HKEY_LOCAL_MACHINE\SOFTWARE ノード下へのアクセス。
32bits アプリ(on WOW64)でここへアクセスすると、一見何の問題もないかのように読み書き出来る。したがって、そのアプリだけが読み書きするキーやエントリーだけであれば、何の問題も起きない。
しかし実際に読み書き出来ているのは、HKEY_LOCAL_MACHINE\SOFTWARE 下ではなく、

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node

と言う、特殊なキーの下へリダイレクトされている、と言うことに注意する必要がある。

したがって問題になるのは、他のアプリ(64bits版)や Windows システムと共用するレジストリエントリである。
そういうケースはあまりないと思われるが、最も可能性の高いのは

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

などへのアクセス。
ここには、Windows に登録してある所有者名や会社名、あるいは、Windows のバージョン情報等が書かれている。
そしてなぜか、32bitsからアクセス出来る Wow6432Node 下の方には、たとえば所有者や会社名として「Microsoft」が登録されており、ProductId 等は設定されていない。
通常、これらを参照する機会は少ないかもしれないが、一部のデータについては他に読み取るAPI等がないことや、コントールパネル等からも設定変更出来ないので、直接操作したいという需要はある。

もちろん、Wow6432Node と言うノードを直接指定してアクセスするという手はあるが、汎用性、ポータビリティなどからは問題だ。
そこで 64bits Windows では、これを回避するための手段が用意されている。

#define KEY_WOW64_64KEY 0x0100

これは

LONG WINAPI RegCreateKeyEx(HKEY hKey,LPCTSTR lpSubKey,DWORD Reserved,LPTSTR lpClass,DWORD dwOptions,REGSAM samDesired,LPSECURITY_ATTRIBUTES lpSecurityAttributes,PHKEY phkResult,LPDWORD lpdwDisposition);

において samDesired で指定するマスク値で、これに KEY_WOW64_64KEY を or 指定した場合に、64bits Windows としてのネィティブな値にアクセス出来るようになる。
指定しなければ、HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node ノード下が HKEY_LOCAL_MACHINE\SOFTWARE ノード下に直接見える。

ただし、このマスク値に対しては 64bits 版 Windows 以外の環境では定義されていないので、指定しない方が無難だろう。
必要な環境かどうかは、

BOOL WINAPI IsWow64Process(HANDLE hProcess,PBOOL pbResult);

と言うAPIを使って調べることが出来る。この API については、Windows XP(SP2?)以降の Kernel32.dll に実装されているようだ。

投稿者 shoda T. : 2011年06月12日 21:12

トラックバック

このエントリーのトラックバックURL:
http://shoda.tk/MT/mt-tb.cgi/820

コメント

コメントしてください

名前とメールアドレスは必須です。メールアドレスはブログ上には表示されません。私に届くだけです。 TypeKey ID のサイン・インも必須ではありません。持ってる方だけサイン・インすればいいです。




保存しますか?

(書式を変更するような一部のHTMLタグを使うことができます)