/// <summary> /// Starts new process inside the job /// </summary> /// <param name="startInfo">Process start parameters</param> /// <param name="beforeStart">An action that would be executed /// between process creation and starting its main thread</param> /// <returns></returns> public Process Start(ProcessStartInfo startInfo, Action <Process> beforeStart = null) { CheckStartInfo(startInfo); ProcessStartupInfo pstartInfo = PrepareStartupInfo(startInfo); ProcessInformation pinfo; if (!CreateProcess(null, startInfo.FileName + " " + startInfo.Arguments, IntPtr.Zero, IntPtr.Zero, false, ProcessCreationFlags.Suspended | ProcessCreationFlags.OutsideJob, IntPtr.Zero, string.IsNullOrEmpty(startInfo.WorkingDirectory) ? null: startInfo.WorkingDirectory, ref pstartInfo, out pinfo)) { throw new Win32Exception(); } Assign(pinfo.ProcessHandle); var process = Process.GetProcessById((int)pinfo.ProcessID); if (beforeStart != null) { beforeStart(process); } if (ResumeThread(pinfo.MainThreadHandle) == uint.MaxValue) { throw new Win32Exception(); } return(process); }
private static extern bool UnmanagedCreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, ProcessCreationFlags dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref ProcessStartupInfo lpStartupInfo, out ProcessInformation lpProcessInformation);
/// <summary> /// Creates a new process and its primary thread. /// </summary> /// <param name="commandLine"></param> /// <param name="creationFlags"></param> /// <param name="currentDirectory"></param> /// <param name="startupInfo"></param> /// <param name="processInformation"></param> /// <exception cref="Win32Exception"></exception> public static void CreateProcess(string commandLine, ProcessCreationFlags creationFlags, string currentDirectory, ref ProcessStartupInfo startupInfo, out ProcessInformation processInformation) { if (!UnmanagedCreateProcess(null, commandLine, IntPtr.Zero, IntPtr.Zero, false, creationFlags, IntPtr.Zero, currentDirectory, ref startupInfo, out processInformation)) { throw new Win32Exception(); } }
private ProcessStartupInfo PrepareStartupInfo(ProcessStartInfo startInfo) { var pstartInfo = new ProcessStartupInfo { Flags = StartupInfoFlags.None, }; pstartInfo.AdjustSize(); return(pstartInfo); }
private Tuple <uint, uint> CreateSuspendedProcess(string filePath, string arguments = "") { ProcessInformation processInfo; ProcessStartupInfo startupInfo = new ProcessStartupInfo(); Kernel32.CreateProcess(filePath + " " + arguments, ProcessCreationFlags.CreateSuspended, Path.GetDirectoryName(filePath), ref startupInfo, out processInfo); return(new Tuple <uint, uint>(processInfo.ProcessId, processInfo.ThreadId)); }
static extern bool CreateProcess(string appName, string commandLine, IntPtr processSecurity, IntPtr threadSecurity, bool inheritHandles, ProcessCreationFlags flags, IntPtr env, string currentDirectory, [In] ref ProcessStartupInfo startInfo, out ProcessInformation processInformation);