2011-08-30 10 views
6

Estoy tratando de copiar un archivo a C: \ windows \ system32 llamando a CopyFileA - la depuración muestra que de hecho la cadena "C: \ windows \ system32 \ filename" se envía a CopyFileA, pero mi archivo se copia a "C : \ windows \ system32 \ sysWOW64 \ filename "en su lugar. ¿Alguien sabe por qué sucede eso?¿Por qué copiar a system32 automáticamente copia a sysWOW64 en su lugar?

+5

1. Probablemente no deba copiar archivos allí de todos modos. 2. Probablemente sea una redirección para las aplicaciones de 32 bits, para evitar las DLL de 32 bits del sistema32 de 64 bits. –

Respuesta

5

En Windows de 64 bits, Windows redirecciona el sistema de archivos para procesos de 32 bits. Para deshabilitar, llame al Wow64DisableWow64FsRedirection

Para que la aplicación también se ejecute en Windows XP de 32 bits, Wow64DisableWow64FsRedirection debe vincularse dinámicamente en tiempo de ejecución. Este es el código que utilizo:

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

Otra solución, por supuesto, es crear su aplicación como de 64 bits. Lo que es preferible depende del contexto. –

2

simplemente si desea comprobar el sistema operativo y comprobar su valor y acceder al system32 carpeta es como:

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

Por ello se puede copiar el archivo en carpeta system32.

disfrutar de: Ali Raza

1

esta solución parece mejor para mí: crédito para 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 
} 
Cuestiones relacionadas