windows32bit-64bitwin64

How to retrieve correct path of either system32 or SysWOW64?


I have a 32-bit process that can run either in 32-bit or 64-bit Windows. So, naturally, if the process tried to access the file c:\windows\system32\file.ext, it would be redirected to c:\windows\SysWOW64\file.ext. So far so good - I don't want to disable the redirection.

My problem is that my process doesn't actually access the file - instead it just takes its path and writes it into a text file, and I want that text file to read SysWOW64 on a 64-bit system, and system32 on a 32-bit system. How can I do that?


Solution

  • The following code will return the correct system directory (system32\syswow64):

    [DllImport("shell32.dll")]
    public static extern bool SHGetSpecialFolderPath(
        IntPtr hwndOwner, [Out]StringBuilder lpszPath, int nFolder, bool fCreate
    );
    
    public static string GetSystemDirectory()
    {
        StringBuilder path = new StringBuilder(260);
        NativeMethods.SHGetSpecialFolderPath(IntPtr.Zero, path, 0x0029, false);
        return path.ToString();
    }
    

    On x86 you'll get %windir%\System32 On X64 you'll get %windir%\SysWow64

    Hope this is helpful