Windows 为什么复制到system32会自动复制到sysWOW64?
我试图通过调用CopyFileA将文件复制到C:\windows\system32-调试显示字符串“C:\windows\system32\filename”确实被发送到CopyFileA,但我的文件被复制到“C:\windows\system32\sysWOW64\filename”。有人知道为什么会发生这种情况吗?在64位Windows上,Windows为32位进程执行文件系统重定向。要禁用,请致电 要使应用程序也在32位Windows XP上运行,必须在运行时动态链接Wow64DisableWow64FsRedirection。 以下是我使用的代码:Windows 为什么复制到system32会自动复制到sysWOW64?,windows,file-copying,system32,syswow64,Windows,File Copying,System32,Syswow64,我试图通过调用CopyFileA将文件复制到C:\windows\system32-调试显示字符串“C:\windows\system32\filename”确实被发送到CopyFileA,但我的文件被复制到“C:\windows\system32\sysWOW64\filename”。有人知道为什么会发生这种情况吗?在64位Windows上,Windows为32位进程执行文件系统重定向。要禁用,请致电 要使应用程序也在32位Windows XP上运行,必须在运行时动态链接Wow64Disabl
BOOL DisableWow64FsRedirection(PVOID* OldValue)
{
#ifdef WIN64
UNREFERENCED_PARAMETER(OldValue);
return TRUE;
#else
typedef BOOL (WINAPI * LPWOW64DISABLEWOW64FSREDIRECTION)(PVOID *);
LPWOW64DISABLEWOW64FSREDIRECTION fnWow64DisableWow64FsRedirection;
HMODULE kernelMod;
BOOL success = TRUE;
kernelMod = GetModuleHandleW(L"kernel32");
if (kernelMod)
{
fnWow64DisableWow64FsRedirection = (LPWOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64DisableWow64FsRedirection");
if (fnWow64DisableWow64FsRedirection)
success = fnWow64DisableWow64FsRedirection(OldValue);
}
return success;
#endif
}
BOOL RevertWow64FsRedirection(PVOID OldValue)
{
#ifdef WIN64
UNREFERENCED_PARAMETER(OldValue);
return TRUE;
#else
typedef BOOL (WINAPI * LPWOW64REVERTWOW64FSREDIRECTION)(PVOID);
LPWOW64REVERTWOW64FSREDIRECTION fnWow64RevertWow64FsRedirection;
HMODULE kernelMod;
BOOL success = TRUE;
kernelMod = GetModuleHandleW(L"kernel32");
if (kernelMod)
{
fnWow64RevertWow64FsRedirection = (LPWOW64REVERTWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64RevertWow64FsRedirection");
if (fnWow64RevertWow64FsRedirection)
success = fnWow64RevertWow64FsRedirection(OldValue);
}
return success;
#endif
}
如果要检查操作系统,只需检查并访问文件夹system32,如下所示:
string os = Environment.GetEnvironmentVariable("WINDIR") + "\\SysWOW64";
if (Directory.Exists(os))
{
destinationDir = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative\\");
}
通过此操作,您可以复制system32文件夹中的文件
享受:
Ali Raza这个解决方案似乎更适合我: 归功于比万·柯林斯
BOOL changeWow64Redirection(PVOID& param, BOOL toDisable = true)
{
#ifdef WIN64
UNREFERENCED_PARAMETER(OldValue);
return TRUE;
#else
typedef BOOL (WINAPI * LPWOW64CHANGEWOW64FSREDIRECTION)(PVOID *);
LPWOW64CHANGEWOW64FSREDIRECTION fnWow64ChangeWow64FsRedirection;
HMODULE kernelMod;
BOOL success = FALSE;
kernelMod = GetModuleHandle(_T("kernel32"));
if (kernelMod)
{
if (toDisable)
fnWow64ChangeWow64FsRedirection = (LPWOW64CHANGEWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64DisableWow64FsRedirection");
else
fnWow64ChangeWow64FsRedirection = (LPWOW64CHANGEWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64RevertWow64FsRedirection");
if (fnWow64ChangeWow64FsRedirection)
success = fnWow64ChangeWow64FsRedirection(¶m);
}
return success;
#endif //WIN64
}
1.无论如何,您可能不应该在那里复制文件。2.它可能是32位应用程序的重定向,以防止32位DLL从64位system32中删除。当然,另一个解决方案是将应用程序构建为64位。哪个更好取决于上下文。