gpt4 book ai didi

c++ - 从 C++ 中的 HKEY 句柄确定注册表项的路径

转载 作者:IT老高 更新时间:2023-10-28 21:55:49 24 4
gpt4 key购买 nike

给定一个 Windows 注册表键的句柄,例如由::RegOpenKeyEx() 设置的那些,是否可以确定该键的完整路径?

我意识到,在一个简单的应用程序中,您所要做的就是查找 5 或 10 行并阅读......但在像我正在调试的应用程序这样的复杂应用程序中,可以打开我感兴趣的 key 来自一系列电话。

最佳答案

使用 LoadLibraryNtQueryKey 导出函数,如以下代码片段所示。

#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;
}

这将在控制台上打印 key 路径:

Key path for 00000FDC is '\REGISTRY\MACHINE\SOFTWARE\Microsoft'.

关于c++ - 从 C++ 中的 HKEY 句柄确定注册表项的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com