private void ControllerOnGameProcessUpdated(bool fromView, HashSet <ProcessInfo> processes) { lock (this) { if (!_isStarted) { return; } var oldCtx = new HashSet <uint>(_processContexts.Keys); oldCtx.ExceptWith(processes.Select(it => it.Pid)); foreach (var pid in oldCtx) { if (_processContexts.TryRemove(pid, out var ctx)) { ctx.Stop(); } } // Check network parse mode var targetMonitorType = DetermineMonitorType(); if (targetMonitorType != _currentMonitorType) { _currentMonitorType = targetMonitorType; // Stop all existing monitors since the parse mode has changed foreach (var context in _processContexts.Values) { context.Stop(); } _processContexts.Clear(); Logger.Info($"Parse mode = {targetMonitorType}."); } foreach (var process in processes) { _processContexts.AddOrUpdate(process.Pid, _pid => { var ctx = new ProcessContext(process, _currentMonitorType); ctx.OnPingOpCodeDetected += code => { Logger.Info($"IPC Ping OpCode detected for pid={_pid}: {code}"); }; ctx.Start(); return(ctx); }, (_, _ctx) => _ctx); } } }
public ProcessContext(ProcessInfo process, NetworkMonitorType monitorType) { Monitor.ProcessID = process.Pid; if (process.FileName == Utils.GameExeNameDx11) { Monitor.OodlePath = process.FilePath; } Monitor.MonitorType = monitorType; // Packet sent by game client won't be captured if filter is enabled for RawSocket mode, // so enable the filter only on WinPCap mode. Monitor.UseRemoteIpFilter = monitorType == NetworkMonitorType.WinPCap; Monitor.MessageReceivedEventHandler = _packetMonitor.MessageReceived; Monitor.MessageSentEventHandler = _packetMonitor.MessageSent; _packetMonitor.OnPingSample += PacketMonitorOnOnPingSample; _packetMonitor.OnPingOpCodeDetected += code => OnPingOpCodeDetected?.Invoke(code); }