2011-08-30 2 views
6

J'essaie de copier un fichier dans C: \ windows \ system32 en appelant CopyFileA - le débogage montre qu'effectivement la chaîne "C: \ windows \ system32 \ filename" est envoyée à CopyFileA, mais mon fichier est copié dans "C : \ windows \ system32 \ sysWOW64 \ filename "à la place. Est-ce que quelqu'un sait pourquoi cela arrive-t-il?Pourquoi la copie sur system32 est-elle automatiquement copiée dans sysWOW64?

+5

1. Vous ne devriez probablement pas copier de fichiers de toute façon. 2. C'est probablement une redirection pour les applications 32 bits, pour empêcher les DLL 32 bits de 64 bits system32. –

Répondre

5

Sur Windows 64 bits, Windows effectue la redirection du système de fichiers pour les processus 32 bits. Pour désactiver, appelez Wow64DisableWow64FsRedirection

Pour que l'application s'exécute également sur Windows XP 32 bits, Wow64DisableWow64FsRedirection doit être lié dynamiquement au moment de l'exécution. Voici le code que j'utilise:

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

Une autre solution, bien sûr, est de construire votre application en 64 bits. Ce qui est préférable dépend du contexte. –

2

simplement si vous voulez vérifier le système d'exploitation puis vérifiez et accéder au system32 dossier est comme:

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

En cela, vous pouvez copier le fichier dossier system32.

Enjoy: Ali Raza

1

cette solution semble mieux pour moi: crédit à 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 
} 
Questions connexes