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。
有没有办法做到这一点?
在 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
.
regedit.exe
64 位 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。
归档时间: |
|
查看次数: |
33572 次 |
最近记录: |