KEY_WOW64_32KEY不从x64应用程序重定向

时间:2012-12-31 20:53:36

标签: c++ winapi registry

我在x64操作系统上运行x64应用程序,我试图从x86注册表中读取 这是我的代码:

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 \ Idontexist ,而不是 HKCU \ Software \ Wow6432Node \ Idontexist

编辑:操作系统是Windows 7,如果这有任何区别。

2 个答案:

答案 0 :(得分:2)

在{7}中详细显示了在Windows 7上重定向和反映的键。此处重现太大,但您可以清楚地看到除了Classes子项之外的HKCU \ Software密钥是共享,而不是重定向。

答案 1 :(得分:0)

Wow6432Node意味着WOW64虚拟化。 64位进程可以直接打开32位虚拟化密钥:

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

如果您需要在32位和64位运行相同的代码并且都访问Wow6432Node密钥,那么在32位代码中使用IsWow64Process()来检测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。如果目标密钥正确分为32位和64位视图,KEY_WOW64_32KEY应正常工作:

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不应该首先存在,并且可能由未正确使用KEY_WOW64_...标志的64位进程错误地创建。