windows - hvorfor kopierer system32 automatisk til sysWOW64 i stedet?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg prøver at kopiere en fil til C: \ windows \ system32 ved at ringe CopyFileA - fejlsøgning viser, at strengen 'C: \ windows \ system32 \ filename' er sendt til CopyFileA, men min fil er kopieret til 'C: \ windows \ system32 \ sysWOW64 \ filnavn 'i stedet. Vet nogen, hvorfor sker det?

Bedste reference


På 64bit Windows gør Windows filsystem omdirigering til 32bit-processer. For at deaktivere, ring Wow64DisableWow64FsRedirection [4]


For at appen også skal køre på 32bit Windows XP, skal Wow64DisableWow64FsRedirection være dynamisk forbundet i løbetid.
Her er koden jeg bruger:


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
}

Andre referencer 1


Bare hvis du vil kontrollere operativsystemet, så tjek det og få adgang til mappesystemet32 er som:


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


Heraf kan du kopiere filen i system32-mappen.


God fornøjelse:
 Ali Raza

Andre referencer 2


denne løsning virker bedre for mig:
kredit til 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(&param);
  }
  return success;
#endif //WIN64
}