public static Win32Process CreateProcess(NtProcess parent, string application_name, string command_line, CreateProcessFlags flags, string desktop) { STARTUPINFOEX start_info = new STARTUPINFOEX(); start_info.StartupInfo.lpDesktop = desktop; PROCESS_INFORMATION proc_info = new PROCESS_INFORMATION(); using (SafeProcThreadAttributeListBuffer buffer = new SafeProcThreadAttributeListBuffer(1)) { using (var handle_buffer = parent.Handle.DangerousGetHandle().ToBuffer()) { buffer.AddAttribute(new IntPtr(0x00020000), handle_buffer); start_info.lpAttributeList = buffer.DangerousGetHandle(); if (!CreateProcess(application_name, command_line, IntPtr.Zero, IntPtr.Zero, false, flags, IntPtr.Zero, null, ref start_info, out proc_info)) { throw new SafeWin32Exception(); } return(new Win32Process(proc_info)); } } }
public static Win32Process CreateProcess(NtProcess parent, string application_name, string command_line, CreateProcessFlags flags, string desktop) { STARTUPINFOEX start_info = new STARTUPINFOEX(); start_info.StartupInfo.lpDesktop = desktop; PROCESS_INFORMATION proc_info = new PROCESS_INFORMATION(); using (SafeProcThreadAttributeListBuffer attr_list = new SafeProcThreadAttributeListBuffer(1)) { using (var handle_buffer = parent.Handle.DangerousGetHandle().ToBuffer()) { attr_list.AddAttribute(new IntPtr(0x00020000), handle_buffer); start_info.lpAttributeList = attr_list.DangerousGetHandle(); if (!CreateProcess(application_name, command_line, IntPtr.Zero, IntPtr.Zero, false, flags | CreateProcessFlags.EXTENDED_STARTUPINFO_PRESENT, IntPtr.Zero, null, start_info, out proc_info)) { throw new SafeWin32Exception(); } return new Win32Process(proc_info); } } }