System.ComponentModel.Win32Exception when starting process - file not found, but file exists

55,102

Clearly you are using a 64-bit version of Windows. The c:\windows\system32 and c:\program files directories are subject to a feature called "file system redirection". It is an appcompat feature, it helps to ensure that 32-bit processes don't try to use 64-bit executables. They'll get redirected to c:\windows\syswow64 and c:\program files (x86).

So when you try to start a file in c:\program files\realtek\etcetera, your 32-bit program will be redirected to c:\program files (x86)\realtek\etcetera. A directory that doesn't exist, kaboom. Same ingredient for igfxtray.exe

You'll need to change your program's platform target so it can run as a native 64-bit process and avoid the redirection problem you now have. Project + Properties, Build tab, change the "Platform target" setting to AnyCPU.

Share:
55,102
pascalhein
Author by

pascalhein

Updated on July 19, 2022

Comments

  • pascalhein
    pascalhein almost 2 years

    I am trying to create a manager for my autostarts. It should read an XML file and then start my programs with a custom delay. For example:

    <startup id="0">
        <name>Realtek Audio Manager</name>
        <process arguments="-s">C:\Program Files\Realtek\Audio\HDA\RtkNGUI64.exe</process>
        <delay>5</delay>
    </startup>
    

    This runs the specified process (C:\Program Files\...\RtkNGUI64.exe -s) after 5 seconds.

    Now, three of the programs won't start, giving me a System.ComponentModel.Win32Exception: "Das System kann die angegebene Datei nicht finden." ("The system was not able to find the specified file.")

    But the XML is parsed correctly, and the file I want to start is at the location I specified in the XML file.

    The problem concerns only these three files:
    Intel HotkeysCmd - C:\Windows\System32\hkcmd.exe
    Intel GFX Tray - C:\Windows\System32\igfxtray.exe
    Intel Persistance - C:\Windows\System32\igfxpers.exe

    I think that the problem comes from the location of the files: they all are located in C:\Windows\System32, and all the other, working programs are located outside (C:\Program Files, C:\Program Files (x86), D:\Program Files, %AppData%)

    Do I have to give my program some kind of access rights to start programs in C:\Windows\System32? How would I do that?

    If not, what could be the reason I get errors with these programs?

    EDIT - my code:

    delegate(object o)
    {
        var s = (Startup) o;
        var p = new System.Diagnostics.Process
                    {
                        StartInfo =
                            new System.Diagnostics.ProcessStartInfo(s.Process, s.Arguments)
                    };
        try
        {
            s.Process = @"C:\Windows\System32\igfxtray.exe"; // For debugging purposes
            System.Diagnostics.Process.Start(s.Process);
            icon.ShowBalloonTip(2000, "StartupManager",
                                "\"" + s.Name + "\" has been started.",
                                System.Windows.Forms.ToolTipIcon.Info);
        }
        catch (System.ComponentModel.Win32Exception)
        {
            icon.ShowBalloonTip(2000, "StartupManager",
                                "\"" + s.Name + "\" could not be found.",
                                System.Windows.Forms.ToolTipIcon.Error);
        }
    }