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);
                }
            }
        }