コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: ProcessFactory.cs プロジェクト: gerardog/gsudo
        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));
        }
コード例 #4
0
ファイル: Process.cs プロジェクト: twoqubits/PowerSession
 public Process(ProcessApi.STARTUPINFOEX startupInfo, ProcessApi.PROCESS_INFORMATION processInfo)
 {
     StartupInfo = startupInfo;
     ProcessInfo = processInfo;
 }