在Visual C++中,有一种方法可以阻止注册表重定向将system32转换为syswow64



我用Visual C++编写了一个程序,该程序检查注册表中的特定reg_expand_sz值是否有更改。默认值为%SystemRoot%\System32\NOTEPAD.EXE。如果该值发生更改,程序会将其重置回默认数据。我正在修改的密钥是共享的或反映的,这取决于Windows的版本,所以我修改的注册表视图(32位或64位)并不重要,因为密钥会同步。

我遇到的问题是,如果我使用64位版本的Windows,并使用32位版本的程序将值的数据更改为%SystemRoot%\System32\NOTEPAD.EXE,由于注册表重定向,数据将被保存为%SystemRoot%\SysWOW64\NOTEPAD.EXE。不过,这不是正确的默认数据。如果我用64位编译这个程序,它会按预期工作。不过,如果可能的话,我宁愿有一个32位的版本,无论操作系统是32位还是64位,都可以重置默认值。

有人知道在reg_sz/reg_expand_sz值中禁用System32到SysWOW64的转换的方法吗?或者知道我可以用来实现这项任务的另一种方法吗?我可以写一个注册表文件,并使用system()来执行reg或regedit并导入它,但我更愿意在程序本身的范围内完成所有操作。

以下是我当前的代码:

    HKEY hKey;
DWORD size;
LONG lResults;
wchar_t szVdata[] = L"%SystemRoot%\System32\NOTEPAD.EXE %1";
size = sizeof(szVdata);
lResults = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\Classes\batfile\shell\edit\command",0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hKey);
if(lResults == ERROR_SUCCESS)
    RegSetValueExW (hKey, L"",0, REG_EXPAND_SZ, (PBYTE)szVdata, size);
RegCloseKey (hKey);

如有任何帮助,我们将不胜感激。

尝试%SystemRoot%\SysNative\

最新更新