static void ShellExecCmdLine(IntPtr hInstance, IntPtr hwnd, string command, string startDir, global::System.Diagnostics.ProcessWindowStyle nShow, ShellExecCmdLineFlags dwSeclFlags, bool runAsAdministrator = false, bool leaveCmdOpen = false) { string cmd = command; string args = null; if (UrlIs(command, URLIS_URL)) { cmd = command; } else { if (global::System.Environment.OSVersion.Version.Major >= 6) { EvaluateSystemAndUserCommandLine(cmd, startDir, out cmd, out args, dwSeclFlags); } else { EvaluateUserCommandLine(cmd, startDir, out cmd, out args); } } if (!UrlIs(cmd, URLIS_URL) && ( (dwSeclFlags & ShellExecCmdLineFlags.SECL_USEFULLPATHDIR) == ShellExecCmdLineFlags.SECL_USEFULLPATHDIR || startDir == null || startDir.Length == 0)) { string dir = QualifyWorkingDir(cmd); if (dir != null) { startDir = dir; } } if (leaveCmdOpen && File.Exists(cmd)) { bool needsCommandLine; try { var peHeaderReader = new PeHeaderReader(cmd); if (peHeaderReader.Is32BitHeader) { needsCommandLine = peHeaderReader.OptionalHeader32.Subsystem == 3; // IMAGE_SUBSYSTEM_WINDOWS_CUI == 3 } else { needsCommandLine = peHeaderReader.OptionalHeader64.Subsystem == 3; } } catch (Exception) { // Error reading the headers. We will try to run the command the standard way. needsCommandLine = false; } if (needsCommandLine) { string cmdExe; string dummy; EvaluateSystemAndUserCommandLine("cmd.exe", startDir, out cmdExe, out dummy, dwSeclFlags); // check whether user typed >cmd, because we don't want to create 2 nested shells if (cmdExe != cmd) { args = string.Format("/k {0} {1}", cmd, args); cmd = cmdExe; } } } global::System.Diagnostics.ProcessStartInfo startInfo = new global::System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.Arguments = args; startInfo.FileName = cmd; if (runAsAdministrator) { startInfo.Verb = "runas"; } startInfo.WindowStyle = global::System.Diagnostics.ProcessWindowStyle.Normal; startInfo.ErrorDialog = (dwSeclFlags | ShellExecCmdLineFlags.SECL_NO_UI) == 0; startInfo.ErrorDialogParentHandle = hwnd; startInfo.WorkingDirectory = startDir; try { global::System.Diagnostics.Process.Start(startInfo); } catch (Exception e) { if (!startInfo.ErrorDialog) { throw e; } } }
static void ShellExecCmdLine(IntPtr hInstance, IntPtr hwnd, string command, string startDir, global::System.Diagnostics.ProcessWindowStyle nShow, ShellExecCmdLineFlags dwSeclFlags) { string cmd = command; string args = null; if (UrlIs(command, URLIS_URL)) { cmd = command; } else { if (global::System.Environment.OSVersion.Version.Major >= 6) { EvaluateSystemAndUserCommandLine(cmd, startDir, out cmd, out args, dwSeclFlags); } else { EvaluateUserCommandLine(cmd, startDir, out cmd, out args); } } if (!UrlIs(cmd, URLIS_URL) && ( (dwSeclFlags & ShellExecCmdLineFlags.SECL_USEFULLPATHDIR) == ShellExecCmdLineFlags.SECL_USEFULLPATHDIR || startDir == null || startDir.Length == 0)) { string dir = QualifyWorkingDir(cmd); if (dir != null) { startDir = dir; } } global::System.Diagnostics.ProcessStartInfo startInfo = new global::System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.Arguments = args; startInfo.FileName = cmd; startInfo.WindowStyle = global::System.Diagnostics.ProcessWindowStyle.Normal; startInfo.ErrorDialog = (dwSeclFlags | ShellExecCmdLineFlags.SECL_NO_UI) == 0; startInfo.ErrorDialogParentHandle = hwnd; try { global::System.Diagnostics.Process.Start(startInfo); } catch (Exception e) { if (!startInfo.ErrorDialog) { throw e; } } }