mirror of
https://github.com/arehnman/yttrium-virtio-gpu.git
synced 2026-10-31 02:05:04 +00:00
54 lines
1.9 KiB
C++
54 lines
1.9 KiB
C++
#include "stdafx.h"
|
|
#include "NetKVMAux.h"
|
|
|
|
typedef LONG NTSTATUS;
|
|
|
|
#ifndef STATUS_BUFFER_TOO_SMALL
|
|
#define STATUS_BUFFER_TOO_SMALL ((NTSTATUS)0xC0000023L)
|
|
#endif
|
|
|
|
#ifndef STATUS_SUCCESS
|
|
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
|
|
#endif
|
|
|
|
wstring NetKVMGetKeyPathFromKKEY(HKEY hKey)
|
|
{
|
|
std::wstring wstrKeyPath;
|
|
if (hKey != NULL)
|
|
{
|
|
HMODULE hNTDll = LoadLibrary(TEXT("ntdll.dll"));
|
|
if (hNTDll != NULL) {
|
|
typedef DWORD (__stdcall *ZwQueryKeyType)(HANDLE KeyHandle,
|
|
int KeyInformationClass,
|
|
PVOID KeyInformation,
|
|
ULONG Length,
|
|
PULONG ResultLength);
|
|
|
|
ZwQueryKeyType pZwQueryKey = reinterpret_cast<ZwQueryKeyType>(::GetProcAddress(hNTDll, "ZwQueryKey"));
|
|
|
|
if (pZwQueryKey != NULL) {
|
|
DWORD dwSize = 0;
|
|
DWORD dwResult = 0;
|
|
dwResult = pZwQueryKey(hKey, 3, 0, 0, &dwSize);
|
|
if (dwResult == STATUS_BUFFER_TOO_SMALL)
|
|
{
|
|
dwSize += sizeof(wchar_t);
|
|
wchar_t* szNameBuf = new wchar_t[dwSize];
|
|
dwResult = pZwQueryKey(hKey, 3, szNameBuf, dwSize, &dwSize);
|
|
if (dwResult == STATUS_SUCCESS)
|
|
{
|
|
szNameBuf[dwSize / sizeof(wchar_t)] = L'\0';
|
|
wstrKeyPath = wstring(szNameBuf + 2);
|
|
}
|
|
|
|
delete[] szNameBuf;
|
|
}
|
|
}
|
|
|
|
FreeLibrary(hNTDll);
|
|
}
|
|
}
|
|
return wstrKeyPath;
|
|
}
|
|
|