如何从位于 c:\windows\sysWow64 下的 cmd.exe 运行 x64 位版本的注册表

Dar*_*qer 6 windows-command-prompt windows-registry

我有一个 32 位应用程序,它必须向注册表的 x64 位部分添加一个值。

我想通过使用来做到这一点regedit.exe -s fileWithKeys.reg,但是当我尝试跨越 regedit(在应用程序的代码中,我使用了C:\windows\sysnative目录)时,我得到了 32 位版本。我需要跨越 x64 位版本的工具 (regedit),以便将这些键添加到正确的 x64 位节点。

我发现我可以通过从那里运行C:\Windows\SysWOW64\cmd.exe和调用来模拟这一点C:\Windows\regedit.exe。我无法运行 64 位版本,因为它似乎运行 32 位版本的 regedit。

有没有办法做到这一点?

Rya*_*ies 6

在 64 位 Windows 中,存在所谓的文件系统和注册表重定向。这些存在是为了与为 32 位 Windows 编写的旧应用程序和为旧版本 Windows 设计的应用程序兼容。WoW64 钩住 32 位进程发出的所有系统调用,这样如果我在 64 位版本的 Windows 上运行的 32 位应用程序调用 C:\Windows\System32,WoW64 将透明地将其重定向到 C:\Windows\SysWoW64,等等。 C:\Windows\Sysnative 虚拟目录将您指向该目录的本机版本(64 位版本),而不管引用该文件系统路径的线程的位数如何。

注册表存在类似的机制,这就是 WoW6432Node 密钥的全部内容。从技术上讲,如果我想简洁的话,我会称这些 32 位和 64 位注册表视图......或者迂腐。

不久前,我编写了一些代码(用 C#),用于从 32 位进程中访问配置单元的本机(64 位)部分中的密钥。这是一个节略的片段:

// Accessing 64-bit registry key from 32-bit process
enum RegAccessFlag
{
    NONE                   = 0,
    KEY_QUERY_VALUE        = 0x0001,
    KEY_SET_VALUE          = 0x0002,
    KEY_CREATE_SUB_KEY     = 0x0004,
    KEY_ENUMERATE_SUB_KEYS = 0x0008,
    KEY_NOTIFY             = 0x0010,
    KEY_CREATE_LINK        = 0x0020,
    KEY_WOW64_64KEY        = 0x0100, // This is the ticket
    KEY_WOW64_32KEY        = 0x0200,
    KEY_WOW64_RES          = 0x0300
}

public static UIntPtr HKEY_LOCAL_MACHINE = new UIntPtr(0x80000002u);

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(UIntPtr hkey, string subKey, int ulOptions, int samDesired, out UIntPtr hkResult);

static void Main(string[] args)
{
    int statusCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE", 0, (int)RegAccessFlag.KEY_WOW64_64KEY | (int)RegAccessFlag.KEY_QUERY_VALUE, out hKey);
}
Run Code Online (Sandbox Code Playgroud)

当然,一旦打开密钥,您仍然需要从密钥中读取一个值,或者创建一个新值,然后记住在完成后关闭密钥,但是如果您愿意编写任何代码,这将使您开始.

但是由于您正在谈论从另一个 32 位进程生成一个 32 位进程,以便子进程可以在 64 位平台上访问注册表的本机视图……您正在处理两者的组合文件系统重定向注册表重定向都会妨碍您。顶部全部关闭器regedit.exe有点这方面的特殊效用。

TL;DR:C:\Windows\sysnative\regedt32.exe尝试一下,而不是regedit.exe.

/sf/ask/856337751/


Hop*_*00b 3

regedit.exe64 位 Windows 操作系统上的默认版本64 位版本

位于的 regedit 可执行文件C:\Windows\SysWOW64是 32 位版本,位于 的可执行文件C:\Windows是 64 位版本。

所以...这就是为什么当您从 运行它时会看到 32 位版本SysWOW64。因为你运行的32位版本。 SysWOW64是 32 位版本所在的位置以及它的使用位置(因为它由 64 位系统运行以实现兼容性)。

Wow6432Node您可以通过下的密钥的存在来验证/检查您正在运行的 regedit 版本HKEY_LOCAL_MACHINE\SOFTWARE。当您从 运行 regedit 时C:\Windows,该节点将存在(它显示注册表项的 32 位版本)。如果您从该注册表项运行 regeditC:\Windows\SysWOW64将不存在,因为您已经在查看 32 位注册表。

C:\Windows\regedit.exe<=> 64 位版本的 regedit。
C:\Windows\SysWOW64\regedit.exe<=> 32 位版本的 regedit。

  • @Darqer 说他们正在从 32 位“cmd.exe”(从“syswow64”目录)启动 regedit。目前尚不清楚他们为什么要这样做,但也许这实际上导致了这种行为? (2认同)