1

x86レジストリから読み取ろうとしているx64OSで実行されているx64アプリケーションがあります。
これは私のコードです:

RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Idontexist", 0, KEY_READ | KEY_WOW64_32KEY, &hKey);

HKCU \ Software \ Wow6432Node \ Idontexistを開こうとしましたが、代わりにHKCU \ Software\Idontexistを開いています。

プロセスモニターで監視しましたが、KEY_WOW64_64KEYまたはKEY_WOW64_32KEYを使用する場合、両方ともHKCU \ Software \ Wow6432Node\IdontexistではなくHKCU\Software\Idontexistを読み取ろうとします。

編集:それが何か違いを生むなら、OSはWindows7です。

4

2 に答える 2

2

Windows 7 でリダイレクトおよび反映されるキーについては、この MSDN ページで詳しく説明しています。ここで再現するには大きすぎますが、Classes サブキー以外の HKCU\Software キーがリダイレクトされずに共有されていることがはっきりとわかります。

于 2012-12-31T21:21:58.697 に答える
0

Wow6432NodeWOW64 仮想化を意味します。64 ビット プロセスは、32 ビット仮想化キーを直接開くことができます。

RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Wow6432Node\\Idontexist", 0, KEY_READ, &hKey);

32 ビットと 64 ビットの両方で同じコードを実行し、両方がWow6432Nodeキーにアクセスする必要がある場合IsWow64Process()は、32 ビット コードで使用して WOW64 を検出し、それに応じてコードを調整します。

#ifdef _WIN64
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Wow6432Node\\Idontexist", 0, KEY_READ, &hKey);
#else
BOOL bIsWow64 = FALSE;
IsWow64Process(GetCurrentProcess(), &bIsWow64);
DWORD Wow64Flags = (bIsWow64) ? KEY_WOW64_32KEY : 0;
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Idontexist", 0, KEY_READ | Wow64Flags, &hKey);
#endif

Wow6432Nodeただし、直接 アクセスするべきではありません。KEY_WOW64_32KEYターゲット キーが 32 ビット ビューと 64 ビット ビューに適切に分離されていれば、正しく動作するはずです。

DWORD Wow64Flags;
#ifdef _WIN64
Wow64Flags = KEY_WOW64_32KEY;
#else
BOOL bIsWow64 = FALSE;
IsWow64Process(GetCurrentProcess(), &bIsWow64);
Wow64Flags = (bIsWow64) ? KEY_WOW64_32KEY : 0;
#endif
RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Idontexist", 0, KEY_READ | Wow64Flags, &hKey);

それが機能しない場合、それはそもそも存在すべきではなかったことを意味し、フラグを正しくSoftware\\Wow6432Node\\Idontexist使用していない 64 ビット プロセスによって誤って作成された可能性があります。KEY_WOW64_...

于 2012-12-31T21:21:25.930 に答える