1

我有一个在 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,如果这有什么不同的话。

4

2 回答 2

2

此 MSDN 页面中详细显示了在 Windows 7 上重定向和反映的键。太大而无法在此处重现,但您可以清楚地看到 HKCU\Software 键,而不是 Classes 子键,是shared,而不是重定向。

于 2012-12-31T21:21:58.697 回答
0

Wow6432Node暗示 WOW64 虚拟化。一个 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最初不应该存在,并且可能是由未KEY_WOW64_...正确使用标志的 64 位进程错误地创建的。

于 2012-12-31T21:21:25.930 回答