1: #include <windows.h>
2: #include <string>
3:
4: typedef LONG NTSTATUS;
5:
6: #ifndef STATUS_SUCCESS
7: #define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
8: #endif
9:
10: #ifndef STATUS_BUFFER_TOO_SMALL
11: #define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
12: #endif
13:
14: std::wstring GetKeyPathFromKKEY(HKEY key)
15: {
16: std::wstring keyPath;
17: if (key != NULL)
18: {
19: HMODULE dll = LoadLibrary(L"ntdll.dll");
20: if (dll != NULL) {
21: typedef DWORD (__stdcall *ZwQueryKeyType)(
22: HANDLE KeyHandle,
23: int KeyInformationClass,
24: PVOID KeyInformation,
25: ULONG Length,
26: PULONG ResultLength);
27:
28: ZwQueryKeyType func = reinterpret_cast<ZwQueryKeyType>(::GetProcAddress(dll, "ZwQueryKey"));
29:
30: if (func != NULL) {
31: DWORD size = 0;
32: DWORD result = 0;
33: result = func(key, 3, 0, 0, &size);
34: if (result == STATUS_BUFFER_TOO_SMALL)
35: {
36: size = size + 2;
37: wchar_t* buffer = new (std::nothrow) wchar_t[size];
38: if (buffer != NULL)
39: {
40: result = func(key, 3, buffer, size, &size);
41: if (result == STATUS_SUCCESS)
42: {
43: buffer[size / sizeof(wchar_t)] = L'\0';
44: keyPath = std::wstring(buffer + 2);
45: }
46:
47: delete[] buffer;
48: }
49: }
50: }
51:
52: FreeLibrary(dll);
53: }
54: }
55: return keyPath;
56: }
57:
58: int _tmain(int argc, _TCHAR* argv[])
59: {
60: HKEY key = NULL;
61: LONG ret = ERROR_SUCCESS;
62:
63: ret = RegOpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft", &key);
64: if (ret == ERROR_SUCCESS)
65: {
66: wprintf_s(L"Key path for %p is '%s'.", key, GetKeyPathFromKKEY(key).c_str());
67: RegCloseKey(key);
68: }
69:
70: return 0;
71: }