【问题标题】:Why copying to system32 automatically copies to sysWOW64 instead?为什么复制到 system32 会自动复制到 sysWOW64?
【发布时间】:2011-11-07 00:06:39
【问题描述】:

我正在尝试通过调用 CopyFileA 将文件复制到 C:\windows\system32 - 调试显示字符串“C:\windows\system32\filename”确实被发送到 CopyFileA,但我的文件被复制到“ C:\windows\system32\sysWOW64\filename" 代替。有谁知道为什么会这样?

【问题讨论】:

  • 1.无论如何,您可能不应该在那里复制文件。 2.可能是对32位应用程序的重定向,以防止32位DLL来自64位系统32。

标签: windows file-copying system32 syswow64


【解决方案1】:

在 64 位 Windows 上,Windows 为 32 位进程执行文件系统重定向。要禁用,请致电Wow64DisableWow64FsRedirection

为了让应用也能在 32 位 Windows XP 上运行,Wow64DisableWow64FsRedirection 必须在运行时动态链接。 这是我使用的代码:

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
}

【讨论】:

  • 当然,另一种解决方案是将您的应用程序构建为 64 位。哪个更可取取决于上下文。
【解决方案2】:

如果你想检查操作系统然后检查它并访问文件夹 system32 就像:

string os = Environment.GetEnvironmentVariable("WINDIR") + "\\SysWOW64";
            if (Directory.Exists(os))
            {
                destinationDir = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative\\");
        }

这样你就可以复制system32文件夹中的文件了。

享受: 阿里拉扎

【讨论】:

    【解决方案3】:

    这个解决方案对我来说似乎更好: 归功于 Bevan Collins。

    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(&param);
      }
      return success;
    #endif //WIN64
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-10
      • 2017-04-08
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多