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); } }
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); }
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); }
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)); } }