Пример #1
0
        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);
                }
            }
        }
Пример #2
0
            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);
            }