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

2024-03-29

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

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


Use LoadLibrary and NtQueryKey导出的函数如以下代码片段所示。

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

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

00000FDC 的关键路径是 '\注册表\机器\软件\微软'。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中从 HKEY 句柄确定注册表项的路径 的相关文章

  • 我的 std::hash for std::tuples...有什么改进吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有些人可能已经注意到 std hash 不支持元组 所以我添加了一个重载 它看起来比我到目前为止看到的解决方案 更好 有人有进一步减少这段代码的
  • Visual Studios 2015 中的“恢复 NuGet 包”没有执行任何操作

    我将解决方案从 SVN 拉入 Visual Studios 2015 代码中的一些 使用 引用出现错误 因此我尝试在右键单击 解决方案 中的解决方案时运行 恢复 NuGet 包 选项探索者 这没有任何作用 我必须手动进入 nuget 管理器
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 采用 std::vector 或 std::array 的模板函数

    我有一个函数 当前接受 2 个向量 其中可以包含任何普通的旧数据 template
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • Boost MPI 在监听列表时不会释放资源?

    这是一个后续问题如何释放 boost mpi request https stackoverflow com questions 44078901 how do i free a boostmpirequest 我在监听列表而不是单个项目时
  • C# 异步任务比同步慢

    你知道为什么同步斐波那契方法比异步 等待更快并且比异步任务更快吗 我在每个项目方法上都使用了异步 所以主要是这是一个非常糟糕的方法 Code static int FibonacciSync int number if number 0 r
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • C# 中 PKCS11Interop 库的线程安全使用 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 PKCS11Interop 在 HSM 内执行密钥管理操作 我使用的 HSM 是 Thales PCI Express 下面是
  • 预编译头和 Visual Studio

    有没有办法设置 Visual Studio 解决方案参数 以便它只创建预编译头而不构建整个解决方案 具体来说 它是一个巨大的 C 解决方案 本身有许多项目 谢谢 仅选择 pch 创建者源文件 通常是 stdafx cpp 然后编译该文件 C
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • Windows 上本机 C++ 应用程序中的自动死代码检测?

    背景 我有一个用原生 C 编写的应用程序 花了几年的时间 大约有 60 KLOC 有很多函数和类已经死了 可能有 10 15 就像下面提出的类似的基于 Unix 的问题 我们最近开始对所有新代码进行单元测试 并尽可能将其应用于修改后的代码
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 基础设施 - 同步和异步接口和实现? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在实现库 基础设施时 并且该 API 的用户希望同步和异步使用代码 我读到混合同步和异步并不是一个好主意 例如 同步实现包括等待异步实现 显然
  • 如何在控制台程序中获取鼠标位置?

    如何在 Windows 控制台程序中用 C 获取鼠标单击位置 点击时返回鼠标位置的变量 我想用简单的文本命令绘制一个菜单 这样当有人点击时 游戏就会注册它并知道位置 我知道如何做我需要做的一切 除了单击时获取鼠标位置 您需要使用 Conso

随机推荐

  • csv-parse 解析的对象的第一个属性不可访问

    我正在使用以下内容解析 csv 文件csv 解析 https csv js org parse userID sysID 20 50 30 71 但是 在返回的对象上 无法访问从第一列创建的属性userID 这是我的代码 async fun
  • 改造:将对象列表反序列化为不同类型

    开发 Android 应用程序 我正在使用改造来得到我的回应 目前我已经制作了一个 POJO 模型类 其中包含所有类型的字段 实际上它们有更多的字段和自己的方法 所以我在这里简化了它们很多 代码来自Client class OkHttpCl
  • 使用 R TM 包查找 2 和 3 个单词短语

    我正在尝试找到一个代码 该代码实际上可以在 R 文本挖掘包中找到最常用的两个和三个单词短语 也许还有另一个我不知道的包 我一直在尝试使用标记器 但似乎没有运气 如果您过去处理过类似的情况 您可以发布经过测试且实际有效的代码吗 太感谢了 您可
  • 1.9.1 的 ruby​​ ping

    我想在我的 ruby 代码中 ping 一个站点 发现 net ping 是一个很好的库 不幸的是 当我尝试 gem install net ping 时 出现以下错误 C gt gem 安装 net ping错误 安装 net ping
  • MVVM 符合 WPF 应用程序中的本地化

    如何使用 MVVM 模式本地化 WPF 应用程序 我真的很想以 正确 的方式去做 我当前的方法是使用 resx 资源文件来本地化我的应用程序 我将它们包含在我的 xaml 代码中 xmlns localization clr namespa
  • asp.net 网站中的 Quartz.net 设置

    我刚刚将quartz net dll 添加到我的bin 中并启动了我的示例 如何使用基于时间的quartz net 调用C 方法 using System using System Collections Generic using Sys
  • 开始后取消/停止 jquery fadeOut

    我有一个非常简单的页面 当用户单击页面上的特定条目时 该页面会显示状态更新 这一切工作正常 第一次点击更新id sts 如果输出正确 6 秒后这种现象就会消失 然而 虽然它会淡出 但如果用户单击另一个链接 DIV 会使用新文本进行更新 但它
  • Symfony2 动态/依赖形式

    我有一个包含 3 个依赖字段的表单 制造商 gt 制造商产品组 gt 制造商产品系列 所以我想选择一个制造商 基于制造商的产品组和基于产品组的产品系列 有一个 CookBook Entry 关于如何处理此类动态表单 它很容易为Manufac
  • 手动滚动到锚点时更改 url?

    默认情况下 如果我的网站中有锚点 则当我单击链接 即 www mysite com anchor 时 地址栏上的 URL 会发生更改 当我滚动到某个锚点时 是否可以立即更改地址栏中的 URL 或者有一个包含多个锚点的长文档 当我点击新的锚点
  • 分裂蜂群图

    如何按组分割蜂群图 类似于 使用 ggplot2 分割小提琴图 https stackoverflow com questions 35717353 split violin plot with ggplot2 但我想得到的不是密度图 而是
  • 全屏模式下的 ChromeDriver

    我正在尝试将 F11 发送到 ChromeDriver 但它没有响应 当我按 F11 时 Chrome 就会进入全屏模式 当我通过 ChromeDriver 发送 F11 时 却没有 这对于 ChromeDriver 中的任何 F 键都是相
  • 字典 <> 中的条目有限制吗?

    我有大约 3000 个不同的文件需要在游戏过程中的不同时间进行组织和检索 我创建了自己的变量结构 我正在考虑创建一本 词典 在我的应用程序开始时 只需在游戏开始之前加载我的所有文件 我想知道性能 包含这么多条目的字典会导致我的应用程序变慢吗
  • 使用反射从 Visual Studio(32 位)中的 T4 模板中分析 64 位 DLL

    我想使用反射从 T4 模板中分析 DLL 以便我可以根据反射分析的结果生成代码 我知道 EnvDTE 将是一个更好的选择 但由于多种原因 这在我的情况下是不可能的 反射的问题是 DLL 是 64 位 DLL 如果我在 T4 模板中加载它 我
  • 新进程完成后保持控制台窗口打开

    我目前有一部分代码可以创建一个新进程并从 shell 执行它 Process p new Process p Start p WaitForExit 这使得窗口在进程运行时保持打开状态 这很棒 不过 我也想把窗户打开after完成查看潜在消
  • 如何编写一个 C 程序来执行另一个程序?

    在linux中 我想编写一个启动另一个程序的C程序 当程序运行时 shell 将等待您输入您在程序中定义的命令 该命令将启动第二个程序 例如 假设在与调用程序相同的目录中有一个名为 hello 的简单 C 程序 hello 程序打印输出 h
  • 为什么使用 libnfc 和 PN532 SHIELD 时“找不到 NFC 设备”

    我在 ArchLinux 上安装了 libnfc 并通过我的 Adafruit PN532 arduino SHIELD 使用它 nfc list返回消息 未找到 NFC 设备 我在 etc nfc devices d pn532 conf
  • 连接到上游时没有实时上游,但上游正常

    我对 NGINX 有一个非常奇怪的问题 我有以下内容upstream conf文件 具有以下上游 upstream files 1 least conn check interval 5000 rise 3 fall 3 timeout 1
  • 即使启用了假脱机文件池,如何找到具有给定 ID 的作业的假脱机文件?

    我想将给定 Windows 打印作业的假脱机数据复制到磁盘上的任意位置 我有打印作业的作业 ID后台打印程序 API http msdn microsoft com en us library windows desktop dd16286
  • table_exists() 方法可能无法正常工作

    我开始使用 codeigniter 2 1 0 编写一个简单的模型类 我现在想要它做的就是创建和删除它所代表的 MySQL 表 这是代码
  • 在 C++ 中从 HKEY 句柄确定注册表项的路径

    给定 Windows 注册表项的句柄 例如由 RegOpenKeyEx 设置的句柄 是否可以确定该注册表项的完整路径 我意识到在一个简单的应用程序中 您所要做的就是查找 5 或 10 行并阅读 但是在像我正在调试的复杂应用程序中 我感兴趣的