2011-08-30 3 views
6

CopyFileA를 호출하여 C : \ windows \ system32로 파일을 복사하려고합니다. "C : \ windows \ system32 \ filename"문자열이 실제로 CopyFileA로 전송되지만 내 파일은 "C : \ windows \ system32 \ sysWOW64 \ filename "대신 사용하십시오. 아무도 왜 그런 일이 일어날 지 알고 있습니까?왜 system32로 복사하면 대신 자동으로 sysWOW64로 복사됩니까?

+5

1. 어쨌든 파일을 복사해서는 안됩니다. 2. 아마 64 비트 시스템 32에서 32 비트 DLL을 방지하기 위해 32 비트 응용 프로그램의 리디렉션 일 것입니다. –

답변

5

64 비트 Windows에서 Windows는 32 비트 프로세스 용 파일 시스템 리디렉션을 수행합니다. 사용을 중지하려면 Wow64DisableWow64FsRedirection

앱을 32 비트 Windows XP에서도 실행하려면 런타임에 Wow64DisableWow64FsRedirection을 동적으로 연결해야합니다. 이로써

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

당신이에서 파일을 복사 할 수 있습니다 : 당신이 다음 운영 체제를 확인을 확인하고 폴더 system32를 같은입니다 액세스 할 간단히 경우

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 
} 
+0

다른 솔루션은 물론 애플리케이션을 64 비트로 빌드하는 것입니다. 어떤 것이 문맥에 의존하는 것이 바람직합니다. –

2

: 여기 내가 사용하는 코드입니다 system32 폴더에 있습니다.

는 즐기십시오 : 알리 라자

1

이 솔루션은 나를 위해 더 나은 것 같다 신용 Bevan에 콜린스에.

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 
} 
관련 문제