Пример #1
0
        /// <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);
        }
Пример #2
0
 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);
Пример #3
0
 /// <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();
     }
 }
Пример #4
0
        private ProcessStartupInfo PrepareStartupInfo(ProcessStartInfo startInfo)
        {
            var pstartInfo = new ProcessStartupInfo {
                Flags = StartupInfoFlags.None,
            };

            pstartInfo.AdjustSize();
            return(pstartInfo);
        }
Пример #5
0
        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));
        }
Пример #6
0
 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);