2011-08-30 36 views
6

CopyFileAを呼び出すことによってファイルをC:\ windows \ system32にコピーしようとしています - デバッグでは実際に "C:\ windows \ system32 \ filename"という文字列がCopyFileAに送信されますが、 :\ windows \ system32 \ sysWOW64 \ filename "と入力します。誰がなぜそれが起こるのか知っていますか?なぜsystem32へのコピーが自動的にsysWOW64にコピーされるのですか?

+5

1.おそらくファイルをコピーしてはいけません。 2.おそらく、32ビットアプリケーションが32ビットDLLを64ビットsystem32から保護するためのリダイレクトです。 –

答えて

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 
} 
+0

もう1つの解決策は、アプリケーションを64ビットとして構築することです。どちらが好ましいかは、文脈によって異なる。 –

2

オペレーティングシステムを確認したいだけならば、それをチェックして、フォルダのSYSTEM32が似ているアクセス:これにより

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

あなたがファイルをコピーすることができますsystem32フォルダー。

は、楽しみなさい: アリラザ

1

このソリューションは、私にとっては良さそうです: クレジットをビーヴァンコリンズに。

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 
} 
関連する問題