Пример #1
0
        internal void UpdateState_DbgThread(DbgProcessState newState)
        {
            bool raiseStateChanged, raiseIsRunningChanged, raiseIsDebuggingChanged;

            lock (lockObj) {
                raiseStateChanged = state != newState;
                state             = newState;
                var newIsRunning = CalculateIsRunning_NoLock();
                raiseIsRunningChanged   = cachedIsRunning != newIsRunning;
                cachedIsRunning         = newIsRunning;
                raiseIsDebuggingChanged = state == DbgProcessState.Terminated;
            }
            if (raiseStateChanged)
            {
                OnPropertyChanged(nameof(State));
            }
            if (raiseIsRunningChanged)
            {
                IsRunningChanged?.Invoke(this, EventArgs.Empty);
            }
            if (raiseIsDebuggingChanged)
            {
                IsDebuggingChanged?.Invoke(this, EventArgs.Empty);
            }
        }
Пример #2
0
        public DbgProcessImpl(DbgManagerImpl owner, Dispatcher dispatcher, int pid, DbgProcessState state, bool shouldDetach)
        {
            lockObj         = new object();
            engineInfos     = new List <EngineInfo>();
            threads         = new List <DbgThread>();
            this.owner      = owner ?? throw new ArgumentNullException(nameof(owner));
            this.state      = state;
            cachedIsRunning = CalculateIsRunning_NoLock();
            Id           = pid;
            ShouldDetach = shouldDetach;

            const int dwDesiredAccess = NativeMethods.PROCESS_VM_OPERATION | NativeMethods.PROCESS_VM_READ |
                                        NativeMethods.PROCESS_VM_WRITE | NativeMethods.PROCESS_QUERY_LIMITED_INFORMATION;

            hProcess = NativeMethods.OpenProcess(dwDesiredAccess, false, pid);
            if (hProcess.IsInvalid)
            {
                throw new InvalidOperationException($"Couldn't open process {pid}, error: 0x{Marshal.GetLastWin32Error():X8}");
            }

            Bitness         = ProcessUtilities.GetBitness(hProcess.DangerousGetHandle());
            Architecture    = GetArchitecture(Bitness);
            OperatingSystem = GetOperatingSystem();
            var info = GetProcessName(pid);

            Filename  = info.filename ?? string.Empty;
            Name      = info.name ?? string.Empty;
            debugging = CalculateDebugging_NoLock();

            new DelayedIsRunningHelper(this, dispatcher, RaiseDelayedIsRunningChanged_DbgThread);
        }
Пример #3
0
        public DbgProcessImpl(DbgManagerImpl owner, Dispatcher dispatcher, ulong pid, DbgProcessState state, bool shouldDetach)
        {
            lockObj         = new object();
            engineInfos     = new List <EngineInfo>();
            threads         = new List <DbgThread>();
            this.owner      = owner ?? throw new ArgumentNullException(nameof(owner));
            this.state      = state;
            cachedIsRunning = CalculateIsRunning_NoLock();
            Id           = pid;
            ShouldDetach = shouldDetach;

            const int dwDesiredAccess = NativeMethods.PROCESS_VM_OPERATION | NativeMethods.PROCESS_VM_READ |
                                        NativeMethods.PROCESS_VM_WRITE | NativeMethods.PROCESS_QUERY_LIMITED_INFORMATION;

            hProcess = NativeMethods.OpenProcess(dwDesiredAccess, false, (int)pid);
            if (hProcess.IsInvalid)
            {
                throw new InvalidOperationException($"Couldn't open process {pid}");
            }

            Bitness  = ProcessUtilities.GetBitness(hProcess.DangerousGetHandle());
            Machine  = GetMachine(Bitness);
            Filename = GetProcessFilename(pid) ?? string.Empty;
            Name     = Path.GetFileName(Filename);

            new DelayedIsRunningHelper(this, dispatcher, RaiseDelayedIsRunningChanged_DbgThread);
        }
Пример #4
0
        internal void Add_DbgThread(DbgEngine engine, DbgRuntimeImpl runtime, DbgProcessState newState)
        {
            bool raiseStateChanged, raiseDebuggingChanged, raiseIsRunningChanged;

            DbgThread[] addedThreads;
            lock (lockObj) {
                engineInfos.Add(new EngineInfo(engine, runtime));
                var newDebugging = CalculateDebugging_NoLock();
                raiseStateChanged     = state != newState;
                raiseDebuggingChanged = !StringArrayEquals(debugging, newDebugging);
                state = newState;
                if (raiseDebuggingChanged)
                {
                    debugging = newDebugging;
                }
                var newIsRunning = CalculateIsRunning_NoLock();
                raiseIsRunningChanged   = cachedIsRunning != newIsRunning;
                cachedIsRunning         = newIsRunning;
                addedThreads            = runtime.Threads;
                runtime.ThreadsChanged += DbgRuntime_ThreadsChanged;
            }
            RuntimesChanged?.Invoke(this, new DbgCollectionChangedEventArgs <DbgRuntime>(runtime, added: true));
            if (addedThreads.Length != 0)
            {
                ThreadsChanged?.Invoke(this, new DbgCollectionChangedEventArgs <DbgThread>(addedThreads, added: true));
            }
            if (raiseStateChanged)
            {
                OnPropertyChanged(nameof(State));
            }
            if (raiseIsRunningChanged)
            {
                IsRunningChanged?.Invoke(this, EventArgs.Empty);
            }
            if (raiseDebuggingChanged)
            {
                OnPropertyChanged(nameof(Debugging));
            }
        }