0

次のコードを使用して、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 32 ビット レジストリに格納されている値を取得しますが、上記のコードを使用して「通常の」64 ビット レジストリを読み取ろうとすると、エラー コード 0x3e6 (ERROR_NOACCESS) が表示されます。

メソッドを呼び出す方法:

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

64 ビットのレジストリ値を読み取るにはどうすればよいですか? ありがとう

4

1 に答える 1

1

pwcの割り当てとポインタ演算が問題を引き起こしていると思います。path関数に直接渡しRegOpenKeyExます。

が260バイトを超えるlstrcpyと、バッファオーバーフローが発生することにも注意してください。path代わりに、WindowsでStringCchCopyを使用して、宛先バッファーで使用可能なバイト数までのみコピーする文字列コピーを提供します。

于 2013-01-08T17:16:09.870 に答える