示例#1
0
        private static int Main(string[] args)
        {
            if (Environment.GetEnvironmentVariable("ARGJSON") != null && Environment.GetEnvironmentVariable("ARGJSON").Length >= 2)
                args = JsonConvert.DeserializeObject<string[]>(Environment.GetEnvironmentVariable("ARGJSON"));

            if (args.Length < 2)
            {
                Console.Error.WriteLine("Launcher was run with insufficient arguments. Usage: launcher.exe <app directory> <start command>");
                return 1;
            }

            PROCESS_INFORMATION processInformation;
            var startupInformation = new STARTUPINFO();
            var workingDirectory = Path.Combine(Directory.GetCurrentDirectory(), args[0]);
            var executablePath = workingDirectory + @"\" + args[1];

            if (String.IsNullOrWhiteSpace(args[1]))
            {
                Console.Error.WriteLine("Could not determine a start command. Use the -c flag to 'cf push' to specify a custom start command.");
                return 1;
            }
            Console.Out.WriteLine("Running {0}", executablePath);

            var result = CreateProcess(null, executablePath, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, workingDirectory, ref startupInformation, out processInformation);
            if (!result)
            {
                return Marshal.GetLastWin32Error();
            }
            WaitForSingleObject(processInformation.hProcess, INFINITE);
            UInt32 exitCode = 0;
            GetExitCodeProcess(processInformation.hProcess, ref exitCode);
            return (int) exitCode;
        }
        private void Debugger(object value)
        {
            _continue = true;
            var parameters = value as object[];
            var filename = parameters[0] as string;
            var arguments = parameters[1] as string;

            if (!string.IsNullOrEmpty(arguments) && !arguments.StartsWith(" "))
                arguments = string.Concat(" ", arguments);

            var si = new STARTUPINFO();
            PROCESS_INFORMATION pi;

            //Create Process

            if (!CreateProcess(null, string.Format("\"{0}\"{1}", filename, arguments),
                IntPtr.Zero, IntPtr.Zero, true,
                ProcessCreationFlags.DEBUG_ONLY_THIS_PROCESS | ProcessCreationFlags.DEBUG_PROCESS,
                IntPtr.Zero, null, ref si, out pi))
                throw new Exception(string.Format("Failed to start {0}.", Path.GetFileName(filename)));

            //if (!CreateProcess(null, string.Format("\"{0}\"{1}", filename, arguments),
            //   IntPtr.Zero, IntPtr.Zero, false,
            //   ProcessCreationFlags.NORMAL_PRIORITY_CLASS,
            //   IntPtr.Zero, null, ref si, out pi))
            //    throw new Exception(string.Format("Failed to start {0}.", Path.GetFileName(filename)));

            //Open Process Handle
            _handle = OpenProcess(ProcessAccessPriviledges.PROCESS_VM_READ | ProcessAccessPriviledges.PROCESS_TERMINATE | ProcessAccessPriviledges.PROCESS_VM_WRITE | ProcessAccessPriviledges.PROCESS_VM_OPERATION,
                false, pi.dwProcessId);

            //Create debug event
            var debugEvent = new DEBUG_EVENT()
            {
                dwProcessId = pi.dwProcessId,
                dwThreadId = pi.dwThreadId
            };

            try
            {
                do
                {
                    //DebugDetector.AssertCheckRunning();

                    if (WaitForDebugEvent(ref debugEvent, 100))
                    {
                        switch (debugEvent.dwDebugEventCode)
                        {
                            //Continue
                            case DebugEventTypes.EXCEPTION_DEBUG_EVENT:
                            case DebugEventTypes.CREATE_THREAD_DEBUG_EVENT:
                            case DebugEventTypes.LOAD_DLL_DEBUG_EVENT:
                            case DebugEventTypes.UNLOAD_DLL_DEBUG_EVENT:
                            case DebugEventTypes.OUTPUT_DEBUG_STRING_EVENT:
                            case DebugEventTypes.EXIT_THREAD_DEBUG_EVENT:
                                break;

                            case DebugEventTypes.CREATE_PROCESS_DEBUG_EVENT:
                                _fileHandle = debugEvent.u.CreateProcessInfo.hFile;
                                _processId = debugEvent.dwProcessId;
                                _processStarted = true;
                                break;

                            //Exit the loop
                            case DebugEventTypes.EXIT_PROCESS_DEBUG_EVENT:
                            case DebugEventTypes.RIP_EVENT:
                            default:
                                _continue = false;
                                break;
                        }
                    }

                    if (_signalEnd && _processStarted)
                    {
                        Process process;
                        if (TryGetAttachedProcess(out process) == true)
                            process.CloseMainWindow();
                    }

                    ContinueDebugEvent(debugEvent.dwProcessId,
                        debugEvent.dwThreadId, DebugStates.DBG_CONTINUE);
                }
                while (_continue);
            }
            finally
            {
                End();

                TaskHandler.RunTask(delegate(object input)
                {
                    if (OnExiting != null)
                        OnExiting(this, EventArgs.Empty);
                });
            }
        }
示例#3
0
 static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes,
                                 IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags,
                                 IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo,
                                 out PROCESS_INFORMATION lpProcessInformation);
示例#4
0
 static extern bool CreateProcess(string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes,
                                  IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags,
                                  IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo,
                                  out PROCESS_INFORMATION lpProcessInformation);