前几天接到zlzlzl老师的提议,制作此工具,以方便为论坛的老人们,现将遇到的一些问题写出来做一记录
首先是扯犊子,win64位环境下操作32位软件会被重定向,由于我所使用的编译器为win32,故无法直接写入64位的注册表。
根据MSDN,以下注册表项也会被重定向。
HKEY_LOCAL_MACHINE\Software
HKEY_USERS\*\Software\Classes
HKEY_USERS\*_Classes
32位进程想要访问64位注册表(或者64位进程想要访问32位注册表),需调用RegEnableReflectionKey和RegDisableReflectionKey关闭与开启注册表重定向,使用RegOpenKeyEx并通过设置samDesired 的KEY_WOW64_32KEY和KEY_WOW64_64KEY标志位来打开想要打开的注册表项
下为32位程序访问64位注册表的操作
#define KEY_WOW64_64KEY 256
#define KEY_WOW64_32KEY 512
typedef bool (__stdcall *RegEnableReflectionKey )(HKEY);
typedef bool (__stdcall *RegDisableReflectionKey)(HKEY);
HINSTANCE libInst = LoadLibrary("Advapi32.dll");
if (!libInst) return false; //Couldn't load library
RegEnableReflectionKey EnableReflectionKey=(RegEnableReflectionKey)GetProcAddress(libInst, "RegEnableReflectionKey");
RegDisableReflectionKey DisableReflectionKey=(RegDisableReflectionKey)GetProcAddress(libInst, "RegDisableReflectionKey");
if(DisableReflectionKey)
{
DisableReflectionKey(p_hKey);
}
#define KEY_WOW64_64KEY 256
#define KEY_WOW64_32KEY 512
::RegOpenKeyEx(p_hKey, p_pSubKey, NULL, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hkey);
if(EnableReflectionKey)
{
EnableReflectionKey(hkey);
}
~( ̄▽ ̄~)(~ ̄▽ ̄)~
2016年8月6日 下午4:21各种懵逼
2016年8月6日 上午9:59大师笔记·····
2016年8月5日 下午5:50