在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 ;
}
#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
'
.