C++中根据HKey查找当前打开的注册表路径Key Name

在StackOverFlow里找到的,一定要收藏起来。

#include <windows.h>
#include 
<string>

typedef LONG NTSTATUS;

#ifndef STATUS_SUCCESS
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#endif

#ifndef STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
#endif

std::wstring GetKeyPathFromKKEY(HKEY key)
{
    std::wstring keyPath;
    
if (key != NULL)
    {
        HMODULE dll 
= LoadLibrary(L"ntdll.dll");
        
if (dll != NULL) {
            typedef DWORD (__stdcall 
*ZwQueryKeyType)(
                HANDLE  KeyHandle,
                
int KeyInformationClass,
                PVOID  KeyInformation,
                ULONG  Length,
                PULONG  ResultLength);

            ZwQueryKeyType func 
= reinterpret_cast<ZwQueryKeyType>(::GetProcAddress(dll, "ZwQueryKey"));

            
if (func != NULL) {
                DWORD size 
= 0;
                DWORD result 
= 0;
                result 
= func(key, 300&size);
                
if (result == STATUS_BUFFER_TOO_SMALL)
                {
                    size 
= size + 2;
                    wchar_t
* buffer = new (std::nothrow) wchar_t[size];
                    
if (buffer != NULL)
                    {
                        result 
= func(key, 3, buffer, size, &size);
                        
if (result == STATUS_SUCCESS)
                        {
                            buffer[size 
/ sizeof(wchar_t)] = L'\0';
                            keyPath 
= std::wstring(buffer + 2);
                        }

                        delete[] buffer;
                    }
                }
            }

            FreeLibrary(dll);
        }
    }
    
return keyPath;
}

int _tmain(int argc, _TCHAR* argv[])
{
    HKEY key 
= NULL;
    LONG ret 
= ERROR_SUCCESS;

    ret 
= RegOpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft"&key);
    
if (ret == ERROR_SUCCESS)
    {
        wprintf_s(L
"Key path for %p is '%s'.", key, GetKeyPathFromKKEY(key).c_str());    
        RegCloseKey(key);
    }

    
return 0;
}

输出:

Key path for 00000FDC is '\REGISTRY\MACHINE\SOFTWARE\Microsoft'.
微信扫一扫交流

作者:CoderZh
公众号:hacker-thinking (一个程序员的思考)
独立博客:http://blog.coderzh.com
博客园博客将不再更新,请关注我的「微信公众号」或「独立博客」。
作为一个程序员,思考程序的每一行代码,思考生活的每一个细节,思考人生的每一种可能。
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/coderzh/p/1599732.html