private void AttachButton_Click(object aObj, System.Windows.RoutedEventArgs aEvent) { AttachButton.IsEnabled = false; RefreshButton.IsEnabled = false; if (!_attached) { var process = ProcessListBox.SelectedItems.Cast <ProcessInfo>().ToList(); var attached = false; if (process[0].CanUseMono) { _unityMod = new UnityVRMod(); _unityMod.MessageReceivedHandler += OnMessageReceived; _unityMod.Inject(process[0].Id, process[0].FrameworkVersion, process[0].MonoModule); attached = true; } if (process[0].CanUseXInput) { _xinputMod = new XInputMod(); _xinputMod.Attach(process[0].Id); _xinputMod.MessageReceivedHandler += OnMessageReceived; attached = true; } if (attached) { ProcessAttached?.Invoke(this, null); } } else { ProcessDetached?.Invoke(this, null); Detach(); } }
public bool Attach(Process process) { Detach(); Process = process; Process.EnableRaisingEvents = true; Process.Exited += ProcessDetached; BaseAddress = Process.MainModule.BaseAddress.ToInt64(); if ((Handle = Kernel32.OpenProcess(Kernel32.PROCESS_ALL_ACCESS, false, Process.Id)) != IntPtr.Zero) { GetClientBuild(); ProcessAttached?.Invoke(this, EventArgs.Empty); return(true); } return(false); }
/// <summary>Opens the given process to gather informations from.</summary> /// <param name="info">The process information.</param> public void Open(ProcessInfo info) { Contract.Requires(info != null); if (process != info) { lock (processSync) { Close(); rttiCache.Clear(); process = info; handle = coreFunctions.OpenRemoteProcess(process.Id, ProcessAccess.Full); } ProcessAttached?.Invoke(this); } }