private static ProcessApi.PROCESS_INFORMATION RunProcess(ref ProcessApi.STARTUPINFOEX sInfoEx, string commandLine) { var securityAttributeSize = Marshal.SizeOf <ProcessApi.SECURITY_ATTRIBUTES>(); var pSec = new ProcessApi.SECURITY_ATTRIBUTES { nLength = securityAttributeSize }; var tSec = new ProcessApi.SECURITY_ATTRIBUTES { nLength = securityAttributeSize }; var success = CreateProcess( null, commandLine, ref pSec, ref tSec, false, EXTENDED_STARTUPINFO_PRESENT, IntPtr.Zero, null, ref sInfoEx, out var pInfo ); if (!success) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not create process."); } return(pInfo); }
private static ProcessApi.STARTUPINFOEX ConfigureProcessThread(IntPtr hPC, IntPtr attributes) { // this method implements the behavior described in https://docs.microsoft.com/en-us/windows/console/creating-a-pseudoconsole-session#preparing-for-creation-of-the-child-process var lpSize = IntPtr.Zero; var success = InitializeProcThreadAttributeList( IntPtr.Zero, 1, 0, ref lpSize ); if (success || lpSize == IntPtr.Zero ) // we're not expecting `success` here, we just want to get the calculated lpSize { throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not calculate the number of bytes for the attribute list."); } var startupInfo = new ProcessApi.STARTUPINFOEX(); startupInfo.StartupInfo.cb = Marshal.SizeOf <ProcessApi.STARTUPINFOEX>(); startupInfo.lpAttributeList = Marshal.AllocHGlobal(lpSize); success = InitializeProcThreadAttributeList( startupInfo.lpAttributeList, 1, 0, ref lpSize ); if (!success) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not set up attribute list."); } success = UpdateProcThreadAttribute( startupInfo.lpAttributeList, 0, attributes, hPC, (IntPtr)IntPtr.Size, IntPtr.Zero, IntPtr.Zero ); if (!success) { throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not set pseudoconsole thread attribute."); } return(startupInfo); }
internal static SafeProcessHandle CreateProcessAsUserWithFlags(string lpApplicationName, string args, ProcessApi.CreateProcessFlags dwCreationFlags, out PROCESS_INFORMATION pInfo) { var sInfoEx = new ProcessApi.STARTUPINFOEX(); sInfoEx.StartupInfo.cb = Marshal.SizeOf(sInfoEx); IntPtr lpValue = IntPtr.Zero; var pSec = new ProcessApi.SECURITY_ATTRIBUTES(); var tSec = new ProcessApi.SECURITY_ATTRIBUTES(); pSec.nLength = Marshal.SizeOf(pSec); tSec.nLength = Marshal.SizeOf(tSec); var command = $"{lpApplicationName} {args}"; Logger.Instance.Log($"{nameof(CreateProcessAsUser)}: {lpApplicationName} {args}", LogLevel.Debug); if (!ProcessApi.CreateProcess(null, command, ref pSec, ref tSec, false, dwCreationFlags, IntPtr.Zero, null, ref sInfoEx, out pInfo)) { throw new Win32Exception((int)ConsoleApi.GetLastError()); } return(new SafeProcessHandle(pInfo.hProcess, true)); }
public Process(ProcessApi.STARTUPINFOEX startupInfo, ProcessApi.PROCESS_INFORMATION processInfo) { StartupInfo = startupInfo; ProcessInfo = processInfo; }