标签: registry-virtualization

从32位应用程序访问64位注册表

我需要"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"在c ++中打开一个注册表项.它包含java 64位应用程序.该注册表项的完整路径是"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{26A24AE4-039D-4CA4-87B4-2F86416024FF}".

我们可以通过regedit查看此路径.我用

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{26A24AE4-039D-4CA4-87B4-2F86416024FF}"),
    0, KEY_ALL_ACCESS, &hKey)
Run Code Online (Sandbox Code Playgroud)

打开注册表; 但它返回错误值(2).

returnStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall")...
Run Code Online (Sandbox Code Playgroud)

返回成功结果.我能做什么?

c++ windows registry 64-bit registry-virtualization

17
推荐指数
2
解决办法
1万
查看次数

为什么注册表写在不同于预期的位置?

我尝试将注册表子项及其对应的值写入注册表,如下所示:

const string subKey = @"SOFTWARE\Apple\Banana\";
const string regKey = "pip";

var rk = Registry.LocalMachine.OpenSubKey(subKey);
if (rk == null)
    rk = Registry.LocalMachine.CreateSubKey(subKey);

var rv = rk.GetValue(regKey);
if (rv == null)
    rk.SetValue(regKey, "XXX");

return rv.ToString();
Run Code Online (Sandbox Code Playgroud)

现在的问题是,我当我手动查找的位置(通过注册表编辑器),我不能看到该文件夹SOFTWARE\Apple\BananaHKLM.

但是当我再次运行上面的代码并进行调试时,我可以看到两者Registry.LocalMachine.OpenSubKey(subKey)rk.GetValue(regKey)产生之前保存的值.然而,我没有通过regedit看到给定位置的值.所以在搜索注册表时,我可以在以下位置看到上面的键和值:

  1. HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

  2. HKEY_USERS\S-1-5-21-44266131-1313801407-2392705078-1000\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

在两者之下,价值保持与我保存完全一样.所以我意识到这是我的应用程序读取值的地方虽然在我的代码中我称之为HKLM\SOFTWARE\Apple\Banana\..

  1. 为什么会这样?它与访问权限问题有关吗?

  2. 这是预期的行为吗?从某种意义上说,这个值对我来说非常重要,所以我只知道是否存在与自动重定位相关的风险!

  3. 是否有正确的方式写入注册表,以便它保持在其确切的位置..

我的帐户是管理员一,我使用的是32位Windows 7.

编辑:据我所知,注册表项存储在当前用户位置而不是HKLM中.当我从另一个帐户查询reg值时,我没有得到该值.简而言之,首先将它保存到HKLM没有意义:(

c# registry regedit registry-virtualization access-rights

9
推荐指数
2
解决办法
7812
查看次数

KEY_WOW64_32KEY和KEY_WOW64_64KEY

除了MSDN参考,我想知道这些键的作用是什么?KEY_WOW64_32KEY是否意味着x64操作系统上的32位应用程序将访问WOW64注册表树?又请问KEY_WOW64_64KEY意味着在x64操作系统的32位应用程序将使用普通的注册表树,而不是WOW64注册表树?如果我必须访问一些我不知道是否位于WOW64或普通注册表树中的密钥怎么办?

windows registry winapi registry-virtualization registrykey

8
推荐指数
1
解决办法
2万
查看次数

如何使用应用程序的虚拟化注册表创建"沙盒"?

我们有一个第三方本机应用程序(用CI编写),我们希望在一台机器上运行多个实例.

但是,应用程序从一个特定的注册表项读取和写入,以便找到配置文件的位置.它在运行期间连续读取此位置.注册表项位于HKLM中.这意味着如果我们尝试运行2个不同的应用程序实例,并为配置文件提供2个不同的位置,则这些进程会依赖于其他脚趾.

是否有可能"虚拟化"进程正在使用的注册表(或运行沙盒中的每个进程),以便他们可以认为他们正在写入一个位置,但实际上他们正在从不同的地方编写和阅读,他们赢了踩到对方的脚趾?

windows registry process sandbox registry-virtualization

6
推荐指数
1
解决办法
3627
查看次数