zoukankan      html  css  js  c++  java
  • 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
    博客园博客将不再更新,请关注我的「微信公众号」或「独立博客」。
    作为一个程序员,思考程序的每一行代码,思考生活的每一个细节,思考人生的每一种可能。
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    第2课 C 到 C++ 的升级
    第1课 学习 C++ 的意义
    归并排序
    插入排序与希尔排序
    选择排序
    冒泡排序
    CodeSignal 刷题 —— almostIncreasingSequence
    CodeSignal 刷题 —— matrixElementSum
    Python3 序列解包
    单星号变量(*)和双星号变量(**)的用法
  • 原文地址:https://www.cnblogs.com/coderzh/p/1599732.html
Copyright © 2011-2022 走看看