HKCR が HKLM\SOFTWARE\Classes のショートカットである証明

Determine path to registry key from HKEY handle in C++ - Stack Overflow

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#define STATUS_SUCCESS 0

BOOL GetKeyPathFromKKEY(HKEY key,wchar_t *keys)
{
    DWORD result = -1;
    if (key != NULL)
    {
        HMODULE dll = LoadLibraryW(L"ntdll.dll");
        *keys = 0;
        if (dll != NULL) {
            typedef DWORD (__stdcall *NtQueryKeyType)(
                HANDLE  KeyHandle,
                int KeyInformationClass,
                PVOID  KeyInformation,
                ULONG  Length,
                PULONG  ResultLength);

            NtQueryKeyType func = reinterpret_cast<NtQueryKeyType>(::GetProcAddress(dll, "NtQueryKey"));

            if (func != NULL) {
                DWORD size = 0;
                result = func(key, 3, keys, 1024, &size);
                if (result == STATUS_SUCCESS)
                {
                    keys[size / sizeof(wchar_t)] = L'\0';
                    lstrcpyW(keys, keys + 2);
                }
            }
            FreeLibrary(dll);
        }
    }
    return result;
}

int main(int argc, char* argv[])
{
    HKEY key = NULL;
    LONG ret = ERROR_SUCCESS;
    wchar_t keys[1024];
    ret = RegOpenKeyW(HKEY_CLASSES_ROOT, L".au\\OpenWithProgIds", &key);
    if (ret == ERROR_SUCCESS)
    {
        GetKeyPathFromKKEY(key,keys);
        wprintf(L"Key path for %p is '%ws'.", key, keys);
        RegCloseKey(key);
    }
    return 0;
}

上のようなコードを書いて実行すると

HKEY_CLASSES_ROOT\.au\\OpenWithProgIds を開いて得られたレジストリのパスが分かるのですが

得られる結果は \REGISTRY\MACHINE\SOFTWARE\Classes\.au\OpenWithProgIds
HKEY_CLASSES_ROOT は HKEY_LOCAL_MACHINE\SOFTWARE\Classes のショートカットであることが証明できました( ˘ω˘ )

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です