HKEY로 레지스트리 키 얻기

http://stackoverflow.com/questions/937044/determine-path-to-registry-key-from-hkey-handle-in-c

#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 *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; 
                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/sizeof(wchar_t)]; // size is in bytes 
                   
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; 
} 

부모키 리턴

prev 1 ··· 23 24 25 26 27 28 29 ··· 54 next