Я пытаюсь скопировать файл в C: \ windows \ system32, вызывая CopyFileA - отладка показывает, что действительно строка «C: \ windows \ system32 \ filename» отправляется в CopyFileA, но мой файл копируется в «C: \ windows \ system32 \ sysWOW64 \ filename ". Кто-нибудь знает, почему так происходит?
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
}
Просто, если вы хотите проверить операционную систему, проверьте ее и получите доступ к папке system32:
string os = Environment.GetEnvironmentVariable("WINDIR") + "\\SysWOW64";
if (Directory.Exists(os))
{
destinationDir = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative\\");
}
Таким образом вы можете скопировать файл в папку system32.
Наслаждайтесь: Али Раза
Это решение кажется мне лучше: спасибо Бевану Коллинзу.
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(¶m);
}
return success;
#endif //WIN64
}
Похожие вопросы
Новые вопросы
windows
Написание программного обеспечения, специфичного для операционной системы Microsoft Windows: API-интерфейсы, поведение и т. Д. ОБЩАЯ ПОДДЕРЖКА WINDOWS НЕВОЗМОЖНА. Вопросы поддержки можно задать на https://superuser.com