Bypassing File System Redirection for Process.Start in 32-bit Applications

When executing Process.Start in a 32-bit application on a 64-bit Windows system, file system redirection can lead to a "file not found" error. This occurs because the operating system typically redirects access from C:\Windows\System32 to C:\Windows\SysWoW64 for 32-bit processes. For instance, attempting to launch the On-Screen Keyboadr (osk.exe) located at C:\Windows\System32\osk.exe might fail.

There are a couple of common approaches to address this issue:

Method 1: Temporarily Disable File System Redirection

This method involves using Win32 API functions to temporarily disable and then re-enable file system redirection for the current thread.

Win32 API Functions

  • Wow64DisableWow64FsRedirection: This function disables the file system redirection for the calling process.
  • Wow64RevertWow64FsRedirection: This function re-anables the file system redirection that was previous disabled by Wow64DisableWow64FsRedirection.

Code Example


using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;

public class ProcessLauncher
{
    // Import the necessary Win32 API functions
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr previousValue);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool Wow64RevertWow64FsRedirection(IntPtr restoreValue);

    public static void LaunchVirtualKeyboard()
    {
        // Check if the On-Screen Keyboard process is already running
        if (Process.GetProcessesByName("osk").Any())
        {
            return; // Process is already running, do nothing
        }

        IntPtr redirectValue = IntPtr.Zero;
        bool redirectionDisabled = false;

        try
        {
            // Attempt to disable file system redirection
            redirectionDisabled = Wow64DisableWow64FsRedirection(ref redirectValue);

            if (redirectionDisabled)
            {
                // If redirection is successfully disabled, start the process
                Process.Start(@"C:\Windows\System32\osk.exe");
            }
            else
            {
                // Handle the case where redirection could not be disabled
                Console.WriteLine("Failed to disable Wow64 file system redirection.");
            }
        }
        catch (Exception ex)
        {
            // Log or handle the exception appropriately
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
        finally
        {
            // Always attempt to re-enable redirection if it was disabled
            if (redirectionDisabled && redirectValue != IntPtr.Zero)
            {
                Wow64RevertWow64FsRedirection(redirectValue);
            }
        }
    }
}

Method 2: Utilize the 'sysnative' Alias

On 64-bit systems, the sysnative alias provides a way for 32-bit applications to directly access the 64-bit System32 directory. By using C:\Windows\Sysnative instead of C:\Windows\System32, you can circumvent the default redirection.

Code Example


using System;
using System.Diagnostics;

public class ProcessLauncher
{
    public static void LaunchVirtualKeyboardUsingSysnative()
    {
        // Check if the On-Screen Keyboard process is already running
        if (Process.GetProcessesByName("osk").Any())
        {
            return; // Process is already running, do nothing
        }

        try
        {
            // The direct path with sysnative might still fail in some contexts
            // Process.Start(@"C:\Windows\Sysnative\osk.exe");

            // A more reliable approach is to launch cmd.exe and then execute osk.exe
            var processInfo = new ProcessStartInfo(@"C:\Windows\Sysnative\cmd.exe", "/c osk.exe")
            {
                CreateNoWindow = true,    // Do not show the cmd window
                UseShellExecute = false   // Required for redirecting I/O, though not used here
            };
            Process.Start(processInfo);
        }
        catch (Exception ex)
        {
            // Log or handle the exception appropriately
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

Note: While C:\Windows\Sysnative\osk.exe might seem like a direct solution, launching cmd.exe with /c osk.exe and using the sysnative path for cmd.exe is often more robust.

Tags: C# Win32 API File System Redirection Sysnative Process.Start

Posted on Wed, 22 Jul 2026 16:33:24 +0000 by vij