Почему копирование в system32 вместо этого автоматически копируется в sysWOW64?

Я пытаюсь скопировать файл в C:\windows\system32, вызвав CopyFileA - отладка показывает, что действительно строка "C:\windows\system32\filename" отправляется в CopyFileA, но мой файл копируется в "C:\ вместо этого windows\system32\sysWOW64\filename". Кто-нибудь знает, почему это происходит?


person speller    schedule 30.08.2011    source источник
comment
1. Вы, вероятно, не должны копировать файлы туда в любом случае. 2. Вероятно, это перенаправление для 32-битных приложений, чтобы предотвратить 32-битные библиотеки DLL из 64-битной системы32.   -  person Cat Plus Plus    schedule 30.08.2011


Ответы (3)


В 64-битной Windows Windows выполняет перенаправление файловой системы для 32-битных процессов. Чтобы отключить, вызовите Wow64DisableWow64FsRedirection.

Чтобы приложение также работало в 32-разрядной версии Windows XP, Wow64DisableWow64FsRedirection должно быть динамически связано во время выполнения. Вот код, который я использую:

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
}
person Bevan Collins    schedule 30.08.2011
comment
Другим решением, конечно же, является создание 64-битного приложения. Что предпочтительнее, зависит от контекста. - person Harry Johnston; 31.08.2011

Просто, если вы хотите проверить операционную систему, проверьте ее и получите доступ к папке system32, например:

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

Таким образом вы можете скопировать файл в папку system32.

Наслаждайтесь: Али Раза

person user1300339    schedule 29.03.2012

это решение кажется мне лучшим: кредит Бевану Коллинзу.

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
}
person user2783174    schedule 24.12.2013