public bool Launch() { if (CanLaunch() == false) { throw new Exception("Unable to launch in this state"); } if (args.Length == 0) { return(false); } var DebugCreationFlags = WinProcesses.ProcessCreationFlags.DEBUG_ONLY_THIS_PROCESS | WinProcesses.ProcessCreationFlags.CREATE_NEW_CONSOLE; var launchArgs = new StringBuilder(string.Join(" ", args)); bool bRet = WinProcesses.NativeMethods.CreateProcess ( null, launchArgs, null, null, false, DebugCreationFlags, null, null, stStartInfo, stProcessInfo ); if (bRet == true) { // Store so they can be marshalled and closed correctly hProcess = new WinProcesses.SafeProcessHandle(stProcessInfo.hProcess); hThread = new WinProcesses.SafeThreadHandle(stProcessInfo.hThread); bContinue = true; State = RunState.Running; } else { throw new Exception($"Failed to launch loader '{launchArgs}'"); } return(bRet); }
public void StartSuspended() { var pi = new WinProcesses.PROCESS_INFORMATION(); var si = new WinProcesses.STARTUPINFO(); var processCreationFlags = WinProcesses.ProcessCreationFlags.CREATE_SUSPENDED; if (SpawnNewConsoleWindow) { processCreationFlags |= WinProcesses.ProcessCreationFlags.CREATE_NEW_CONSOLE; } if (!WinProcesses.NativeMethods.CreateProcess(null, new StringBuilder(string.Join(" ", args)), null, null, false, processCreationFlags, null, null, si, pi)) { throw new Win32Exception("Error while creating a new process."); } hProcess = new WinProcesses.SafeProcessHandle(pi.hProcess); pid = pi.dwProcessId; hThread = new WinProcesses.SafeThreadHandle(pi.hThread); }