CopyFileAを呼び出してファイルをC:\ windows \ system32にコピーしようとしています-デバッグでは、文字列「C:\ windows \ system32 \ filename」が実際にCopyFileAに送信されますが、ファイルは「C:\」にコピーされます。代わりにwindows\system32 \ sysWOW64\filename"。なぜそれが起こるのか誰かが知っていますか?
質問する
3760 次
3 に答える
5
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
}
于 2011-08-30T22:50:36.347 に答える
2
オペレーティングシステムを確認したい場合は、それを確認してフォルダーsystem32にアクセスすると、次のようになります。
string os = Environment.GetEnvironmentVariable("WINDIR") + "\\SysWOW64";
if (Directory.Exists(os))
{
destinationDir = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative\\");
}
これにより、system32 フォルダーにファイルをコピーできます。
お楽しみください: アリ・ラザ
于 2012-03-29T09:21:59.110 に答える
1
この解決策は私にとってより良いようです。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(¶m);
}
return success;
#endif //WIN64
}
于 2013-12-24T12:41:15.823 に答える