2011-08-30 13 views
6

Próbuję skopiować plik do C: \ windows \ system32, wywołując CopyFileA - debugowanie pokazuje, że rzeczywiście ciąg "C: \ windows \ system32 \ filename" jest wysyłany do CopyFileA, ale mój plik jest kopiowany do "C : \ windows \ system32 \ sysWOW64 \ filename "zamiast tego. Czy ktoś wie, dlaczego tak się dzieje?Dlaczego kopiowanie do systemu system32 automatycznie kopiuje do sysWOW64?

+5

1. Prawdopodobnie nie powinieneś kopiować plików. 2. Prawdopodobnie jest to przekierowanie dla aplikacji 32-bitowych, aby zapobiec 32-bitowym bibliotekom DLL z 64-bitowego systemu32. –

Odpowiedz

5

W 64-bitowych systemach Windows system Windows wykonuje przekierowanie systemu plików dla procesów 32-bitowych. Aby wyłączyć, zadzwoń pod numer Wow64DisableWow64FsRedirection Aby aplikacja działała także w 32-bitowym systemie Windows XP, Wow64DisableWow64FsRedirection musi być dynamicznie połączona w czasie wykonywania. Oto kod używam:

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

Innym rozwiązaniem jest oczywiście zbudowanie aplikacji w wersji 64-bitowej. Co jest lepsze, zależy od kontekstu. –

2

Wystarczy, jeśli chcesz sprawdzić system operacyjny, a następnie sprawdzić i uzyskać dostęp do system32 folder jest tak:

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

Przez to można skopiować plik folder system32.

Enjoy: Ali Raza

1

to rozwiązanie wydaje się lepsze dla mnie: kredytu 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 
} 
Powiązane problemy