RegOpenKeyEx returns ERROR_NOACCESS

RegOpenKeyEx returns ERROR_NOACCESS

本文关键字:NOACCESS ERROR returns RegOpenKeyEx      更新时间:2023-10-16

我正在尝试使用以下代码读取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 %sn"), path);
            break;
        }
        if(returnval == ERROR_SUCCESS)
        {
                         // STUFF
        }
   }
}
}

当我使用KEY_READ | KEY_WOW64_32KEY时,我得到存储在32位注册表下的值,但当我使用上面的代码试图读取"正常"64位注册表时,我得到错误代码0x3e6 (ERROR_NOACCESS)

我调用方法的方式:

ReadRegistryKey(HKEY_LOCAL_MACHINE, L"Software\Microsoft\Windows\CurrentVersion\Run");

我能做些什么来读取64位注册表值?由于

我认为pwc的分配和指针算术导致了这个问题。将path直接传入RegOpenKeyEx函数

还值得注意的是,如果path大于260字节,lstrcpy将导致缓冲区溢出。相反,在Windows中使用StringCchCopy来给出一个字符串复制,它只会复制到目标缓冲区中可用的字节数。

相关文章: