/// <summary> /// Create a new process /// </summary> /// <param name="ParentProcess">The parent process</param> /// <param name="Flags">Creation flags</param> /// <param name="SectionHandle">Handle to the executable image section</param> /// <returns>The created process</returns> public static NtProcess CreateProcessEx(NtProcess ParentProcess, ProcessCreateFlags Flags, NtSection SectionHandle) { SafeKernelObjectHandle process; SafeHandle parent_process = ParentProcess != null ? ParentProcess.Handle : Current.Handle; SafeHandle section = SectionHandle != null ? SectionHandle.Handle : null; NtSystemCalls.NtCreateProcessEx(out process, ProcessAccessRights.MaximumAllowed, new ObjectAttributes(), parent_process, Flags, section, null, null, 0).ToNtException(); return(new NtProcess(process)); }
public static extern NtStatus NtCreateUserProcess( out SafeKernelObjectHandle ProcessHandle, out SafeKernelObjectHandle ThreadHandle, ProcessAccessRights ProcessDesiredAccess, ThreadAccessRights ThreadDesiredAccess, ObjectAttributes ProcessObjectAttributes, ObjectAttributes ThreadObjectAttributes, ProcessCreateFlags ProcessFlags, ThreadCreateFlags ThreadFlags, IntPtr ProcessParameters, [In, Out] ProcessCreateInfo CreateInfo, [In, Out] ProcessAttributeList AttributeList );
/// <summary> /// For the current process /// </summary> /// <param name="process_create_flags">Process create flags.</param> /// <param name="thread_create_flags">Thread create flags.</param> /// <param name="throw_on_error">True to throw on error.</param> /// <returns>The new forked process result</returns> public static NtResult <CreateUserProcessResult> Fork(ProcessCreateFlags process_create_flags, ThreadCreateFlags thread_create_flags, bool throw_on_error) { using (var attrs = new DisposableList <ProcessAttribute>()) { ProcessCreateInfo create_info = new ProcessCreateInfo(); SafeStructureInOutBuffer <ClientId> client_id = new SafeStructureInOutBuffer <ClientId>(); attrs.Add(ProcessAttribute.ClientId(client_id)); ProcessAttributeList attr_list = new ProcessAttributeList(attrs); return(NtSystemCalls.NtCreateUserProcess( out SafeKernelObjectHandle process_handle, out SafeKernelObjectHandle thread_handle, ProcessAccessRights.MaximumAllowed, ThreadAccessRights.MaximumAllowed, null, null, process_create_flags | ProcessCreateFlags.InheritFromParent, thread_create_flags, IntPtr.Zero, create_info, attr_list).CreateResult(throw_on_error, () => new CreateUserProcessResult(process_handle, thread_handle, create_info.Data, new SectionImageInformation(), client_id.Result, false))); } }
public static extern NtStatus NtCreateProcessEx(out SafeKernelObjectHandle ProcessHandle, ProcessAccessRights DesiredAccess, ObjectAttributes ObjectAttributes, SafeHandle InheritFromProcessHandle, ProcessCreateFlags Flags, SafeHandle SectionHandle, SafeHandle DebugPort, SafeHandle ExceptionPort, int Unused);
/// <summary> /// For the current process /// </summary> /// <param name="process_create_flags">Process create flags.</param> /// <param name="thread_create_flags">Thread create flags.</param> /// <returns>The new forked process result</returns> public static CreateUserProcessResult Fork(ProcessCreateFlags process_create_flags, ThreadCreateFlags thread_create_flags) { return(Fork(process_create_flags, thread_create_flags, true).Result); }
/// <summary> /// Create a new process /// </summary> /// <param name="Flags">Creation flags</param> /// <param name="SectionHandle">Handle to the executable image section</param> /// <returns>The created process</returns> public NtProcess CreateProcessEx(ProcessCreateFlags Flags, NtSection SectionHandle) { return(CreateProcessEx(this, Flags, SectionHandle)); }