Ejemplo n.º 1
0
 protected virtual void ProcessOnExited(object sender, EventArgs e) {
     if (!_exitedEventPublished) {
         // this boolean does not seem useful but i have seen weird behaviors where the
         // exited event is called twice when we WaitForExit(), better safe than sorry
         _exitedEventPublished = true;
         _cancelRegistration?.Dispose();
         OnProcessExit?.Invoke(sender, e);
     }
 }
Ejemplo n.º 2
0
        private ProcessInfo CreateProcess(string clientPath, string arguments, string logPipeName)
        {
            var processStartInfo = new ProcessStartInfo
            {
                FileName        = clientPath,
                Arguments       = arguments,
                UseShellExecute = false,
            };

            var clientBinDirectory = _fs.Path.GetDirectoryName(_fs.Path.GetFullPath(clientPath));

            if (clientBinDirectory != null)
            {
                processStartInfo.WorkingDirectory = clientBinDirectory;
                _logger.Log($"Setting client working directory to: '{clientBinDirectory}'");
            }
            else
            {
                _logger.Log($"Failed to get client working directory from path: '{clientPath}'");
            }

            var process = new Process
            {
                StartInfo           = processStartInfo,
                EnableRaisingEvents = true,
            };

            foreach (var kp in _env)
            {
                processStartInfo.EnvironmentVariables[kp.Key] = kp.Value;
            }

            var namedPipeToLog = new NamedPipeToLog(_logger, logPipeName);

            process.Exited += (sender, eventArgs) =>
            {
                OnProcessExit?.Invoke(process);

                namedPipeToLog.Close();

                _logger.Log($"Process {process.Id} has exited");
            };

            if (!process.Start())
            {
                _logger.Log("Failed to start process");
                return(null);
            }

            namedPipeToLog.LogPrefix = $"(Pid: {process.Id}) ";
            namedPipeToLog.StartLogging();

            return(new ProcessInfo {
                Process = process
            });
        }
Ejemplo n.º 3
0
        private void ProcWatcher(object sender, DoWorkEventArgs e)
        {
            Dictionary <int, MonkeyProc> knownProcs = new Dictionary <int, MonkeyProc>();

            foreach (MonkeyProc p in MonkeyProc.GetProcesses())
            {
                knownProcs.Add(p.Id, p);
            }

            while (!Cancel)
            {
                Thread.Sleep(100); // don't hog all the cpu

                var current = MonkeyProc.GetProcesses();

                var closed = knownProcs.Values.Except(current, MonkeyProc.ProcessComparer).ToArray(); // 3-21-15 Again, make a copy. The foreach iterator won't be const otherwise

                if (OnProcessExit == null)
                {
                    foreach (MonkeyProc p in closed)
                    {
                        knownProcs.Remove(p.Id);
                    }
                }
                else
                {
                    foreach (MonkeyProc p in closed)
                    {
                        OnProcessExit.Invoke(p, EventArgs.Empty);
                        knownProcs.Remove(p.Id);
                    }
                }

                if (OnProcessStart != null)
                {
                    foreach (MonkeyProc p in current)
                    {
                        if (!knownProcs.ContainsKey(p.Id))
                        {
                            OnProcessStart.Invoke(p, EventArgs.Empty);
                            knownProcs.Add(p.Id, p);
                        }
                    }
                }
            }
            e.Cancel = true;
        }
Ejemplo n.º 4
0
        public void OnExit(object sender, EventArgs e)
        {
            var process = (IProcess)sender;

            lock (_processes)
            {
                if (!_processes.ContainsKey(process))
                {
                    return;
                }

                _processes.Remove(process);
            }

            OnProcessExit?.Invoke(process.StartInfo.FileName, process.ExitCode);
            process.Dispose();
        }
Ejemplo n.º 5
0
 private void Init()
 {
     AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs args) {
         var ex = (Exception)args.ExceptionObject;
         Console.WriteLine($"Exception caught by Global Exception Handler. {ex.Message}.");
         LogError($"Exception caught by Global Exception Handler", ex);
         OnUnHandledException?.Invoke(sender, args);
         if (args.IsTerminating)
         {
             Environment.Exit(0);
         }
     };
     AppDomain.CurrentDomain.ProcessExit += delegate(object sender, EventArgs args)
     {
         OnProcessExit?.Invoke(sender, args);
     };
 }
Ejemplo n.º 6
0
        private ProcessInfo CreateProcess(string clientPath, string arguments, string logPipeName)
        {
            var process = new Process
            {
                StartInfo =
                {
                    FileName        = clientPath,
                    Arguments       = arguments,
                    UseShellExecute = false
                },
                EnableRaisingEvents = true,
            };

            var namedPipeToLog = new NamedPipeToLog(_logger, logPipeName);

            process.Exited += (sender, eventArgs) =>
            {
                OnProcessExit?.Invoke(process);

                namedPipeToLog.Close();

                _logger.Log($"Process {process.Id} has exited");
            };

            if (!process.Start())
            {
                _logger.Log("Failed to start process");
                return(null);
            }

            namedPipeToLog.LogPrefix = $"(Pid: {process.Id}) ";
            namedPipeToLog.StartLogging();

            return(new ProcessInfo {
                Process = process
            });
        }
Ejemplo n.º 7
0
 private void InitCallbacks()
 {
     m_callbacksArray = new Dictionary <ManagedCallbackType, DebugEventHandler <CorEventArgs> > {
         { ManagedCallbackType.OnBreakpoint, (sender, args) => OnBreakpoint?.Invoke(sender, (BreakpointEventArgs)args) },
         { ManagedCallbackType.OnStepComplete, (sender, args) => OnStepComplete?.Invoke(sender, (StepCompleteEventArgs)args) },
         { ManagedCallbackType.OnBreak, (sender, args) => OnBreak?.Invoke(sender, (ThreadEventArgs)args) },
         { ManagedCallbackType.OnException, (sender, args) => OnException?.Invoke(sender, (ExceptionEventArgs)args) },
         { ManagedCallbackType.OnEvalComplete, (sender, args) => OnEvalComplete?.Invoke(sender, (EvalEventArgs)args) },
         { ManagedCallbackType.OnEvalException, (sender, args) => OnEvalException?.Invoke(sender, (EvalEventArgs)args) },
         { ManagedCallbackType.OnCreateProcess, (sender, args) => OnCreateProcess?.Invoke(sender, (ProcessEventArgs)args) },
         { ManagedCallbackType.OnProcessExit, (sender, args) => OnProcessExit?.Invoke(sender, (ProcessEventArgs)args) },
         { ManagedCallbackType.OnCreateThread, (sender, args) => OnCreateThread?.Invoke(sender, (ThreadEventArgs)args) },
         { ManagedCallbackType.OnThreadExit, (sender, args) => OnThreadExit?.Invoke(sender, (ThreadEventArgs)args) },
         { ManagedCallbackType.OnModuleLoad, (sender, args) => OnModuleLoad?.Invoke(sender, (ModuleEventArgs)args) },
         { ManagedCallbackType.OnModuleUnload, (sender, args) => OnModuleUnload?.Invoke(sender, (ModuleEventArgs)args) },
         { ManagedCallbackType.OnClassLoad, (sender, args) => OnClassLoad?.Invoke(sender, (ClassEventArgs)args) },
         { ManagedCallbackType.OnClassUnload, (sender, args) => OnClassUnload?.Invoke(sender, (ClassEventArgs)args) },
         { ManagedCallbackType.OnDebuggerError, (sender, args) => OnDebuggerError?.Invoke(sender, (DebuggerErrorEventArgs)args) },
         { ManagedCallbackType.OnLogMessage, (sender, args) => OnLogMessage?.Invoke(sender, (LogMessageEventArgs)args) },
         { ManagedCallbackType.OnLogSwitch, (sender, args) => OnLogSwitch?.Invoke(sender, (LogSwitchEventArgs)args) },
         { ManagedCallbackType.OnCreateAppDomain, (sender, args) => OnCreateAppDomain?.Invoke(sender, (AppDomainEventArgs)args) },
         { ManagedCallbackType.OnAppDomainExit, (sender, args) => OnAppDomainExit?.Invoke(sender, (AppDomainEventArgs)args) },
         { ManagedCallbackType.OnAssemblyLoad, (sender, args) => OnAssemblyLoad?.Invoke(sender, (AssemblyEventArgs)args) },
         { ManagedCallbackType.OnAssemblyUnload, (sender, args) => OnAssemblyUnload?.Invoke(sender, (AssemblyEventArgs)args) },
         { ManagedCallbackType.OnControlCTrap, (sender, args) => OnControlCTrap?.Invoke(sender, (ProcessEventArgs)args) },
         { ManagedCallbackType.OnNameChange, (sender, args) => OnNameChange?.Invoke(sender, (ThreadEventArgs)args) },
         { ManagedCallbackType.OnUpdateModuleSymbols, (sender, args) => OnUpdateModuleSymbols?.Invoke(sender, (UpdateModuleSymbolsEventArgs)args) },
         { ManagedCallbackType.OnFunctionRemapOpportunity, (sender, args) => OnFunctionRemapOpportunity?.Invoke(sender, (FunctionRemapOpportunityEventArgs)args) },
         { ManagedCallbackType.OnFunctionRemapComplete, (sender, args) => OnFunctionRemapComplete?.Invoke(sender, (FunctionRemapCompleteEventArgs)args) },
         { ManagedCallbackType.OnBreakpointSetError, (sender, args) => OnBreakpointSetError?.Invoke(sender, (BreakpointEventArgs)args) },
         { ManagedCallbackType.OnException2, (sender, args) => OnException2?.Invoke(sender, (Exception2EventArgs)args) },
         { ManagedCallbackType.OnExceptionUnwind2, (sender, args) => OnExceptionUnwind2?.Invoke(sender, (ExceptionUnwind2EventArgs)args) },
         { ManagedCallbackType.OnMDANotification, (sender, args) => OnMDANotification?.Invoke(sender, (MDAEventArgs)args) },
         { ManagedCallbackType.OnExceptionInCallback, (sender, args) => OnExceptionInCallback?.Invoke(sender, (ExceptionInCallbackEventArgs)args) },
     };
 }
Ejemplo n.º 8
0
 private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
 {
     OnProcessExit?.Invoke();
 }
Ejemplo n.º 9
0
 /// <summary>
 /// Raises OnProcessExit event
 /// </summary>
 /// <param name="code">The exit code</param>
 /// <param name="command">Command name to be set to the args Content</param>
 private void RaiseProcessExitEvent(int code, string command)
 {
     OnProcessExit?.Invoke(this, new ProcessEventArgs(code, command));
 }
Ejemplo n.º 10
0
 /// <summary>
 /// Fires the process exit event.
 /// </summary>
 /// <param name="code">The code.</param>
 protected virtual void FireProcessExitEvent(int code)
 {
     //  Get the event and fire it.
     OnProcessExit?.Invoke(this, new ConsoleStreamEventArgs(code));
 }
Ejemplo n.º 11
0
 private void Process_Exited(object sender, EventArgs e)
 {
     state = ProcessState.STOP;
     OnProcessExit?.Invoke();
 }
Ejemplo n.º 12
0
 /// <summary>
 /// Fires the process exit event.
 /// </summary>
 /// <param name="code">The code.</param>
 private void FireProcessExitEvent(int code) => OnProcessExit?.Invoke(this, new ProcessEventArgs(code));
 /// <summary>
 /// Fires the process exit event.
 /// </summary>
 /// <param name="code">The code.</param>
 private void FireProcessExitEvent(int code)
 {
     //  Get the event and fire it.
     OnProcessExit?.Invoke(this, new ProcessEventArgs(code));
 }