我有一个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的本地视图…您正在处理两者文件系统redirect和registryredirect都在你的方式。 最重要的是,在这方面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"