/// <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
     );
Beispiel #3
0
        /// <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);
Beispiel #5
0
 /// <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));
 }