一开始以为关闭32位程序在64位系统里的重定向就可以了
判断系统是不是64位的
BOOL isSystem64(){
SYSTEM_INFO si;
GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture != PROCESSOR_ARCHITECTURE_IA64 )
{
return TRUE;
}
else
{
return FALSE;
}
}
main函数中将需要操作注册表的部分提前禁用,结束后恢复
#ifdef _WIN64
fputs("x64 program \n", stdout);
#else
fputs("x86 program \n", stdout);
PVOID oldVal = NULL;
if(isSystem64()){
if(!Wow64DisableWow64FsRedirection(&oldVal)){
Log(_T("Wow64DisableWow64FsRedirection failed \n"));
}
}
#endif
Log(_T("system: %d bit\n"), isSystem64()?64:32);
// reg operation
#ifdef _WIN64
#else
if(isSystem64()){
Wow64RevertWow64FsRedirection(&oldVal);
}
#endif
结果发现32位程序访问的还是Wow6432Node节点下的注册表键值。不得已百度后发现注册表方式64位的还需要带参数
HKEY getMyRegKey64(){
HKEY hKey;
LSTATUS status = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\MyKey"),
0,
KEY_ALL_ACCESS|KEY_WOW64_64KEY,
&hKey);
if(ERROR_SUCCESS == status){
return hKey;
}
Log(_T("open key64 failed: 0x%x \n"), status);
return NULL;
}
要带上flag:KEY_WOW64_64KEY,32位系统上会忽略该flag
保险起见,32位注册表也带上了32位参数的flag:KEY_WOW64_32KEY
HKEY getMyRegKey32(){
HKEY hKey;
LSTATUS status = RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
_T("SOFTWARE\\WOW6432Node\\Microsoft\\Windows NT\\CurrentVersion\\MyKey"),
0,
KEY_ALL_ACCESS|KEY_WOW64_32KEY,
&hKey);
if(ERROR_SUCCESS == status){
return hKey;
}
Log(_T("open key32 failed: 0x%x \n"), status);
return NULL;
}
目前测试是通过的,注册表的写请求需要管理员权限,需要注意