为什么复制到 system32 会自动复制到 sysWOW64? [英] Why copying to system32 automatically copies to sysWOW64 instead?

查看:39
本文介绍了为什么复制到 system32 会自动复制到 sysWOW64?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

解决方案

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

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

BOOL DisableWow64FsRedirection(PVOID* OldValue){#ifdef WIN64UNREFERENCED_PARAMETER(旧值);返回真;#别的typedef BOOL (WINAPI * LPWOW64DISABLEWOW64FSREDIRECTION)(PVOID *);LPWOW64DISABLEWOW64FSREDIRECTION fnWow64DisableWow64Fs重定向;HMODULE 内核模块;布尔成功 = TRUE;kernelMod = GetModuleHandleW(L"kernel32");如果(内核模块){fnWow64DisableWow64FsRedirection = (LPWOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64DisableWow64FsRedirection");如果(fnWow64DisableWow64FsRedirection)成功 = fnWow64DisableWow64FsRedirection(OldValue);}返回成功;#万一}BOOL RevertWow64FsRedirection(PVOID OldValue){#ifdef WIN64UNREFERENCED_PARAMETER(旧值);返回真;#别的typedef BOOL (WINAPI * LPWOW64REVERTWOW64FSREDIRECTION)(PVOID);LPWOW64REVERTWOW64FS重定向 fnWow64RevertWow64Fs重定向;HMODULE 内核模块;布尔成功 = TRUE;kernelMod = GetModuleHandleW(L"kernel32");如果(内核模块){fnWow64RevertWow64FsRedirection = (LPWOW64REVERTWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64RevertWow64FsRedirection");如果(fnWow64RevertWow64FsRedirection)成功 = fnWow64RevertWow64FsRedirection(OldValue);}返回成功;#万一}

I'm trying to copy a file to C:\windows\system32 by calling CopyFileA - debugging shows that indeed the string "C:\windows\system32\filename" is sent to CopyFileA, but my file is copied to "C:\windows\system32\sysWOW64\filename" instead. Does anyone know why does that happen?

解决方案

On 64bit Windows, Windows does filesystem redirection for 32bit processes. To disable, call Wow64DisableWow64FsRedirection

For the app to also run on 32bit Windows XP, Wow64DisableWow64FsRedirection must be dynamically linked at run-time. Here is the code I use:

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 会自动复制到 sysWOW64?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆