Friday, 16 September 2011

CopyFile on 64 bit windows 7 is not copying to system32 folder - fix.

You will find when you copy e.g. CopyFile(c:\\test.txt","c:\\windows\\system32\\test.txt",FALSE);    the operation completes successfully but no file test.txt is in system32 folder,   the system has actually copied it into syswow64 instead!

to get around this disable syswow64 with below code.
DisableWow64FsRedirection(NULL);
CopyFile(c:\\test.txt","c:\\windows\\system32\\test.txt",FALSE);
RevertWow64FsRedirection(NULL);

BOOL DisableWow64FsRedirection(PVOID* OldValue)
{
#ifdef
UNREFERENCED_PARAMETER(OldValue);
WIN64return TRUE;#else
LPWOW64DISABLEWOW64FSREDIRECTION fnWow64DisableWow64FsRedirection;
HMODULE kernelMod;
BOOL success = TRUE;
kernelMod = GetModuleHandleW(L"kernel32");

{
fnWow64DisableWow64FsRedirection = (LPWOW64DISABLEWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64DisableWow64FsRedirection");

success = fnWow64DisableWow64FsRedirection(OldValue);
}
typedef BOOL (WINAPI * LPWOW64DISABLEWOW64FSREDIRECTION)(PVOID *);if (kernelMod)if (fnWow64DisableWow64FsRedirection)return success;#endif}
BOOL RevertWow64FsRedirection(PVOID OldValue)
{
#ifdef
UNREFERENCED_PARAMETER(OldValue);
WIN64return TRUE;#else
LPWOW64REVERTWOW64FSREDIRECTION fnWow64RevertWow64FsRedirection;
HMODULE kernelMod;
BOOL success = TRUE;
kernelMod = GetModuleHandleW(L"kernel32");

{
fnWow64RevertWow64FsRedirection = (LPWOW64REVERTWOW64FSREDIRECTION)GetProcAddress(kernelMod, "Wow64RevertWow64FsRedirection");

success = fnWow64RevertWow64FsRedirection(OldValue);
}
typedef BOOL (WINAPI * LPWOW64REVERTWOW64FSREDIRECTION)(PVOID);if (kernelMod)if (fnWow64RevertWow64FsRedirection)return success;#endif}