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

我有一个32位应用程序,它必须添加一个值到registry的x64位部分。

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

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

有没有办法做到这一点?

在64位Windows中,存在称为文件系统和registryredirect的内容。 这些存在与为32位Windows编写的旧应用程序以及为旧版Windowsdevise的应用程序兼容。 WoW64挂钩了由32位进程所做的所有系统调用,例如,如果我的32位应用程序运行在64位版本的Windows上,调用C:\ Windows \ System32,WoW64会将其透明地redirect到C:\ Windows \ SysWoW64, C:\ Windows \ Sysnative虚拟目录指向目录的本地版本(64位版本),而不pipe引用该文件系统path的线程的位数。

类似的机制存在于registry中,这就是WoW6432Node关键所在。 从技术上讲,我会打电话给这些registry的32位和64位的意见 ,如果我想简洁…或迂腐。

我在不久之前编写了一些代码(使用C#),用于在32位进程中访问configuration单元本地(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); } 

当然,您还需要从键中读取一个值,或者创build一个新的值,然后记得在完成之后closures键,但是如果您关心写任何代码。

但是由于您正在讨论从另一个32位进程产生一个32位进程,因此subprocess可以在64位平台上访问registry的本地视图…您正在处理两者文件系统redirectregistryredirect都在你的方式。 最重要的是,在这方面regedit.exe是一个特殊的工具。

TL; DR:给C:\Windows\sysnative\regedt32.exe而不是regedit.exe

https://stackoverflow.com/questions/12233396/open-64-bit-regedit-from-32-bit-application

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

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

所以…这就是为什么你从SysWOW64运行它时看到32位版本的原因。 因为你正在运行32位版本。 SysWOW64是32位版本所在的位置,以及它的使用位置(因为它是由64位系统运行的,以便兼容)。

您可以通过HKEY_LOCAL_MACHINE\SOFTWARE下的Wow6432Node项的存在来validation您正在运行的registry版本。 当您从C:\Windows运行regedit时,该节点将存在(它显示您的registry项的32位版本)。 如果您从C:\Windows\SysWOW64运行registry项,该键将不存在,因为您已经在查看32位registry。

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

似乎"%systemroot%\regedit.exe"也做了某种redirect。

从Vista开始,在64位系统中运行32位cmd时可以使用此工具:

 "%systemroot%\sysnative\cmd.exe" /c "%systemroot%\regedit.exe"