static void Main(string[] args) { // Network monitor type TCPNetworkMonitor.NetworkMonitorType MonitorType = TCPNetworkMonitor.NetworkMonitorType.RawSocket; /*StringBuilder errbuff = new StringBuilder(); * pcap_open("", 0, 0, 0, new IntPtr(), errbuff); * if (errbuff.ToString() != "") * { * MonitorType = TCPNetworkMonitor.NetworkMonitorType.WinPCap; * }*/ // Packet queue pq = new LinkedList <Packet>(); // Initialize Machina FFXIVNetworkMonitor monitor = new FFXIVNetworkMonitor { MessageReceived = OnMessageReceived, MessageSent = OnMessageSent, MonitorType = MonitorType }; monitor.Start(); var wizardProcessor = new WizardProcessor(); // Run packet ID stuff wizardProcessor.Run(pq); }
public MainWindow() { InitializeComponent(); repo = Properties.Settings.Default.RepoUrl; db = new Database(repo); captureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType; if (captureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket) { SwitchModeSockets.IsChecked = true; } else { SwitchModePcap.IsChecked = true; } // register the event that is fired after the key press. hook.KeyPressed += new EventHandler <KeyPressedEventArgs>(hook_KeyPressed); // register the control + alt + F12 combination as hot key. try { hook.RegisterHotKey(ModifierKeys.Control, Keys.F12); } catch (Exception) {} //Hook already registered, or something weird happened //var test = Struct.Parse(db.GetServerZoneStruct(0x143), new byte[] {}); }
private void ControllerOnGameProcessUpdated(bool fromView, HashSet <uint> pids) { lock (this) { if (!_isStarted) { return; } var oldCtx = new HashSet <uint>(_processContexts.Keys); oldCtx.ExceptWith(pids); 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(); _plugin.Controller.NotifyLogMessageAppend(false, $"Parse mode = {targetMonitorType}."); } foreach (var pid in pids) { _processContexts.AddOrUpdate(pid, _pid => { var ctx = new ProcessContext(_pid, _currentMonitorType); ctx.OnPingOpCodeDetected += code => { _plugin.Controller.NotifyLogMessageAppend(false, $"IPC Ping OpCode detected for pid={_pid}: 0x{code:x4}"); }; ctx.Start(); return(ctx); }, (_, _ctx) => _ctx); } } }
public ProcessContext(uint pid, TCPNetworkMonitor.NetworkMonitorType monitorType) { Monitor.ProcessID = pid; 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.UseSocketFilter = monitorType == TCPNetworkMonitor.NetworkMonitorType.WinPCap; Monitor.MessageReceived = _packetMonitor.MessageReceived; Monitor.MessageSent = _packetMonitor.MessageSent; _packetMonitor.OnPingSample += PacketMonitorOnOnPingSample; _packetMonitor.OnPingOpCodeDetected += code => OnPingOpCodeDetected?.Invoke(code); }
private void SwitchModePcap_OnClick(object sender, RoutedEventArgs e) { if (AreTabsCapturing()) { MessageBox.Show("A capture is in progress.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } CaptureMode = TCPNetworkMonitor.NetworkMonitorType.WinPCap; SwitchModePcap.IsChecked = true; SwitchModeSockets.IsChecked = false; Properties.Settings.Default.NetworkMonitorType = (int)CaptureMode; Properties.Settings.Default.Save(); }
private void SwitchModeSockets_OnClick(object sender, RoutedEventArgs e) { if (captureWorker != null) { MessageBox.Show("A capture is in progress.", "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } captureMode = TCPNetworkMonitor.NetworkMonitorType.RawSocket; SwitchModePcap.IsChecked = false; SwitchModeSockets.IsChecked = true; Properties.Settings.Default.NetworkMonitorType = captureMode; Properties.Settings.Default.Save(); }
public MainWindow() { ParseCommandlineArguments(); InitializeComponent(); repo = Properties.Settings.Default.RepoUrl; db = new Database(repo); captureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType; if (captureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket) { SwitchModeSockets.IsChecked = true; } else { SwitchModePcap.IsChecked = true; } // register the event that is fired after the key press. hook.KeyPressed += new EventHandler <KeyPressedEventArgs>(hook_KeyPressed); // register the control + alt + F12 combination as hot key. hotkeyTimer = new System.Threading.Timer(TryAssignHotkey, null, 0, 5); if (!string.IsNullOrEmpty(currentXmlFile)) { ChangeTitle(System.IO.Path.GetFileNameWithoutExtension(currentXmlFile)); var packets = CaptureFileOp.Load(currentXmlFile); foreach (PacketListItem packet in packets) { AddPacketToListView(packet); } } //var test = Struct.Parse(db.GetServerZoneStruct(0x143), new byte[] {}); }
public MachinaCaptureWorker(MainWindow window, TCPNetworkMonitor.NetworkMonitorType monitorType) { this.mainWindow = window; this.monitorType = monitorType; }
static void Main(string[] args) { // Use arguments to configure the monitor. int MonitorIndex = Array.IndexOf(args, "--MonitorType"); int PIDIndex = Array.IndexOf(args, "--ProcessID"); int IPIndex = Array.IndexOf(args, "--LocalIP"); int RegionIndex = Array.IndexOf(args, "--Region"); TCPNetworkMonitor.NetworkMonitorType MonitorType = TCPNetworkMonitor.NetworkMonitorType.RawSocket; if (MonitorIndex != -1 && args[MonitorIndex + 1] == "WinPCap") { MonitorType = TCPNetworkMonitor.NetworkMonitorType.WinPCap; } Region localRegion = Region.Global; if (RegionIndex != -1) { if (args[RegionIndex + 1] == "KR") { localRegion = Region.KR; } } else if (!Util.SystemHasGlobalClient()) { if (Util.SystemHasKRClient()) { localRegion = Region.KR; } } // Create the monitor. FFXIVNetworkMonitor monitor = new FFXIVNetworkMonitor { MonitorType = MonitorType, ProcessID = PIDIndex != -1 ? uint.Parse(args[PIDIndex + 1]) : 0, LocalIP = IPIndex != -1 ? args[IPIndex + 1] : "", UseSocketFilter = Array.IndexOf(args, "--UseSocketFilter") != -1 ? true : false, MessageReceived = (string connection, long epoch, byte[] message) => MessageReceived(connection, epoch, message), MessageSent = (string connection, long epoch, byte[] message) => MessageSent(connection, epoch, message) }; // Create the parser. int ParseAlgorithmIndex = Array.IndexOf(args, "--ParseAlgorithm"); if (ParseAlgorithmIndex != -1) { if (args[ParseAlgorithmIndex + 1] == "RAMHeavy") { Parser = new Parser(localRegion, ParserMode.RAMHeavy); } else if (args[ParseAlgorithmIndex + 1] == "CPUHeavy") { Parser = new Parser(localRegion, ParserMode.CPUHeavy); } else if (args[ParseAlgorithmIndex + 1] == "PacketSpecific") { Parser = new Parser(localRegion, ParserMode.PacketSpecific); } else { Parser = new Parser(localRegion, ParserMode.RAMHeavy); } } else { Parser = new Parser(localRegion, ParserMode.RAMHeavy); } // Check for input. string input = ""; // Get the input without blocking the output. Thread InputLoop = new Thread(() => { while (true) { input = Console.In.ReadLine(); // This blocks the InputLoop thread, so there's no need to sleep or anything like that. } }); InputLoop.Start(); // Process the input. Thread InputProcessingLoop = new Thread(() => { while (input != "kill") { if (input == "start") { monitor.Start(); } else if (input == "stop") { try { monitor.Stop(); } catch (NullReferenceException nre) // _monitor is null, and it's a private member of monitor so I can't check if it exists beforehand. { Console.Error.WriteLine(nre); } } input = ""; Thread.Sleep(200); // One-fifth of a second is probably fine for user input, and it's way less intensive than 1. } try { monitor.Stop(); } catch (NullReferenceException) {} InputLoop.Abort(); }); InputProcessingLoop.Start(); }
public MainWindow() { InitializeComponent(); #if !DEBUG AppDomain.CurrentDomain.UnhandledException += delegate(object sender, UnhandledExceptionEventArgs eventArgs) { new ExtendedErrorView("FFXIVMon Reborn ran into an error and needs to close.", eventArgs.ExceptionObject.ToString(), "Unhandled Exception").ShowDialog(); Process.GetCurrentProcess().Kill(); }; #endif bool loadedByArg = false; var args = Environment.GetCommandLineArgs(); for (var i = 1; i + 1 < args.Length; i += 2) { if (args[i] == "--xml") { var tab = new TabItem(); tab.Content = new XivMonTab(); tab.Header = "New Capture"; ((XivMonTab)tab.Content).SetParents(tab, this); MainTabControl.Items.Add(tab); ((XivMonTab)tab.Content).LoadCapture(args[i + 1]); loadedByArg = true; } } if (!loadedByArg) { var item = new TabItem(); item.Content = new XivMonTab(); item.Header = "New Capture"; ((XivMonTab)item.Content).SetParents(item, this); MainTabControl.Items.Add(item); } // register the event that is fired after the key press. _kbHook.KeyPressed += hook_KeyPressed; try { _kbHook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12); } catch (Exception) { // ignored } CaptureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType; if (CaptureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket) { SwitchModeSockets.IsChecked = true; } else { SwitchModePcap.IsChecked = true; } try { ExdReader.Init(Properties.Settings.Default.GamePath); } catch (Exception exc) { new ExtendedErrorView("Unable to init EXD data. Please check your game path in Options -> Set Game Path.", exc.ToString(), "FFXIVMon Reborn").ShowDialog(); Properties.Settings.Default.LoadEXD = false; } if (!Properties.Settings.Default.DontUsePacketTimestamp) { DontUsePacketTimestamp.IsChecked = false; Properties.Settings.Default.DontUsePacketTimestamp = false; } else { CaptureFlags |= MachinaCaptureWorker.ConfigFlags.DontUsePacketTimestamp; DontUsePacketTimestamp.IsChecked = true; Properties.Settings.Default.DontUsePacketTimestamp = true; } if (Properties.Settings.Default.ForceRealtimePriority) { Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; ForceRealtimePriority.IsChecked = true; } if (Properties.Settings.Default.LoadEXD) { ExEnabledCheckbox.IsChecked = true; } if (Properties.Settings.Default.EnableFsWatcher) { WatchDefFilesCheckBox.IsChecked = true; } if (Properties.Settings.Default.HideHexBoxActorId) { HideHexBoxActorIdCheckBox.IsChecked = true; } VersioningProvider.LocalDbChanged += VersioningProviderOnLocalDbChanged; ScriptDebugView.Show(); ScriptDebugView.Visibility = Visibility.Hidden; VersionChecker.CheckVersion(); }
public MachinaCaptureWorker(XivMonTab window, TCPNetworkMonitor.NetworkMonitorType monitorType, ConfigFlags flags) { this._myTab = window; this._monitorType = monitorType; this._configFlags = flags; }
public MainWindow() { InitializeComponent(); bool loadedByArg = false; var args = Environment.GetCommandLineArgs(); for (var i = 1; i + 1 < args.Length; i += 2) { if (args[i] == "--xml") { var tab = new TabItem(); tab.Content = new XivMonTab(); tab.Header = "New Capture"; ((XivMonTab)tab.Content).SetParents(tab, this); MainTabControl.Items.Add(tab); ((XivMonTab)tab.Content).LoadCapture(args[i + 1]); loadedByArg = true; } } if (!loadedByArg) { var item = new TabItem(); item.Content = new XivMonTab(); item.Header = "New Capture"; ((XivMonTab)item.Content).SetParents(item, this); MainTabControl.Items.Add(item); } // register the event that is fired after the key press. _kbHook.KeyPressed += hook_KeyPressed; try { _kbHook.RegisterHotKey(ModifierKeys.Control | ModifierKeys.Alt, Keys.F12); } catch (Exception) { // ignored } CaptureMode = (TCPNetworkMonitor.NetworkMonitorType)Properties.Settings.Default.NetworkMonitorType; if (CaptureMode == TCPNetworkMonitor.NetworkMonitorType.RawSocket) { SwitchModeSockets.IsChecked = true; } else { SwitchModePcap.IsChecked = true; } if (!Properties.Settings.Default.DontUsePacketTimestamp) { DontUsePacketTimestamp.IsChecked = false; Properties.Settings.Default.DontUsePacketTimestamp = false; } else { CaptureFlags |= MachinaCaptureWorker.ConfigFlags.DontUsePacketTimestamp; DontUsePacketTimestamp.IsChecked = true; Properties.Settings.Default.DontUsePacketTimestamp = true; } if (Properties.Settings.Default.ForceRealtimePriority) { Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime; ForceRealtimePriority.IsChecked = true; } if (Properties.Settings.Default.LoadEXD) { ExEnabledCheckbox.IsChecked = true; } if (Properties.Settings.Default.EnableFsWatcher) { WatchDefFilesCheckBox.IsChecked = true; } if (Properties.Settings.Default.HideHexBoxActorId) { HideHexBoxActorIdCheckBox.IsChecked = true; } VersioningProvider.LocalDbChanged += VersioningProviderOnLocalDbChanged; }