我正在尝试使用以下代码在Windows 7 x64下读取注册密钥:
static void ReadRegistryKey(HKEY hkey, TCHAR* path)
{
HKEY hkey2;
TCHAR value[MAX_PATH];
TCHAR data[4096];
const DWORD dataLength = 4096 * sizeof(TCHAR);
const DWORD valueLength = MAX_PATH+1;
DWORD returnval;
DWORD type = 0;
HLOCAL mem = LocalAlloc(LPTR, 260);
char * pc = (char*)mem;
pc++;
wchar_t* pwc = (wchar_t*)pc;
lstrcpy(pwc, path);
// Does key exist?
returnval = RegOpenKeyEx(hkey, pwc, 0 , KEY_READ | KEY_WOW64_64KEY, &hkey2);
if(returnval == ERROR_SUCCESS)
{
int i = 0;
while(returnval == ERROR_SUCCESS)
{
DWORD actualLength = dataLength;
DWORD actualValueLength = valueLength;
returnval = RegEnumValueW( hkey2,
i,
value,
&actualValueLength,
NULL,
&type,
(LPBYTE)data,
&actualLength
);
if(returnval == ERROR_NO_MORE_ITEMS)
{
_tprintf(_T("NO MORE KEYS FOUND in %s\n"), path);
break;
}
if(returnval == ERROR_SUCCESS)
{
// STUFF
}
}
}
}
当我使用KEY_READ |时KEY_WOW64_32KEY我得到32Bit注册表下存储的值,但当我使用上面的代码尝试读取“正常”64位注册时,我得到错误代码0x3e6(ERROR_NOACCESS)
我称之为方法的方式:
ReadRegistryKey(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run");
如何阅读64位注册表值? 感谢
答案 0 :(得分:1)
我认为pwc
的分配和指针算法导致了问题。将path
直接传递到RegOpenKeyEx
函数。
值得注意的是,如果lstrcpy
超过260个字节,path
将导致缓冲区溢出。而是在Windows中使用StringCchCopy来提供一个字符串副本,该副本只会复制到目标缓冲区中可用的字节数。