windows32位程序访问64位注册表

一开始以为关闭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;
}

目前测试是通过的,注册表的写请求需要管理员权限,需要注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值