KEY_WOW64_32KEY没有从x64应用程序重定向

KEY_WOW64_32KEY not redirecting from x64 application

本文关键字:x64 应用程序 重定向 WOW64 32KEY KEY      更新时间:2023-10-16

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

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

我想尝试打开HKCUSoftwareWow6432NodeIdontexist,但它打开的是HKCUSoftwareIdontexist

我在进程监视器中观看,如果我使用KEY_WOW64_64KEY或KEY_WOW64_32KEY,两者都尝试读取HKCUSoftwareIdontexist,而不是HKCUSoftwareWow6432NodeIdontexist

编辑:操作系统是Windows 7,如果有区别的话

在Windows 7上重定向和反映的密钥在此MSDN页面中有详细说明。由于太大,无法在此复制,但您可以清楚地看到HKCUSoftware密钥(除了Classes子密钥)是共享的,而不是重定向的

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一开始就不应该存在,并且可能是由一个64位进程错误地创建的,该进程没有正确使用KEY_WOW64_...标志。