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,  3 0 0 & 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 ' .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值