using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Diagnostics.Tracing.Parsers; using Microsoft.Diagnostics.Tracing.Session; using Newtonsoft.Json; using Microsoft.Diagnostics.Tracing.Parsers.MicrosoftWindowsRPC; using RPCMon.Control; using System.Reflection; using System.Security.Principal; using Newtonsoft.Json.Linq; using Timer = System.Windows.Forms.Timer; namespace RPCMon { public partial class Form1 : Form { private ColumnFilter m_FormColumnFilter; private FormHighlighting m_FormHightlightWindow; private FormSearch m_FormFindWindow; private bool m_IsColumnFilterFormOpen = false; private bool m_IsHighlightFormOpen = false; private bool m_IsFindFormOpen = false; TraceEventSession m_TraceSession; private Tuple m_RightClickContent; private static Dictionary m_ProcessPIDsDictionary = new Dictionary(); private string m_RPCDBPath = ""; private static Dictionary> m_RPCDB; private bool m_IsCaptureButtonPressed = false; private Thread m_CaptureThread; private int m_TotalNumberOfEvents = 0; private int m_TotalShownEvents = 0; private Timer m_Timer; private const string RPC_DB_KEY_Module = "Module"; private const string RPC_DB_KEY_ModulePath = "ModulePath"; private const string RPC_DB_KEY_ProceduresCount = "ProceduresCount"; private const string RPC_DB_KEY_Service = "Service"; private const string RPC_DB_KEY_Procedures = "Procedures"; private const string NA_STRING = "N\\A"; private string m_LastSearchValue; //private ListView m_LastListViewColumnFilter = new ListView(); //private ListView m_LastListViewHighlighFilter = new ListView(); int m_CurrentRowIndexRightClick, m_CurrentColumnIndexRightClick; bool m_IsElevated = false; private bool autoScroll = false; // ListView i_ListView, Utils.eFormNames i_FormName private ListView m_highLightListView = new ListView(); private ListView m_filterListView = new ListView(); private IDictionary> m_IncludeFilterDict = new Dictionary>(); private IDictionary> m_ExcludeFilterDict = new Dictionary>(); private IDictionary> m_IncludeHighlightDict = new Dictionary>(); private IDictionary> m_ExcludeHighlightDict = new Dictionary>(); private bool[] m_IncludeEvents = { true, true, false, false }; public Form1() { InitializeComponent(); configureFormBasedPrivileges(); m_Timer = new Timer(); m_Timer.Tick += new EventHandler(timer1_Tick); m_Timer.Interval = 100; // in miliseconds // timer1.Start(); Center_Picture(); this.m_RPCDBPath = getDBFromCurrentFolder(); this.toolStripStatusLabelDBPath.Text = "DB File: " + Path.GetFileName(this.m_RPCDBPath); Process[] processCollection = Process.GetProcesses(); foreach (Process p in processCollection) { m_ProcessPIDsDictionary.Add(p.Id, p.ProcessName); } //Thread t1 = new Thread(checkIdDBGHelpExist); //t1.Start(); //dummRowsForDebug(); //DataGridViewRow row = new DataGridViewRow(); //DataGridViewCellCollection cells = new DataGridViewCellCollection(row); //dataGridView1.Rows.Add(cells); //dataGridView1.Rows[0].Cells[0].Value = ""; //https://10tec.com/articles/why-datagridview-slow.aspx //if (!System.Windows.Forms.SystemInformation.TerminalServerSession) //{ // Type dgvType = dataGridView1.GetType(); // PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", // BindingFlags.Instance | BindingFlags.NonPublic); // pi.SetValue(dataGridView1, value, null); //} // Remove grid from gridview //this.dataGridView1.AdvancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None; // https://stackoverflow.com/a/10277205/2153777 // For better performance when scrolling the DataGridView typeof(DataGridView).InvokeMember( "DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, dataGridView1, new object[] { true }); } private void configureFormBasedPrivileges() { bool isElevated; using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) { WindowsPrincipal principal = new WindowsPrincipal(identity); isElevated = principal.IsInRole(WindowsBuiltInRole.Administrator); m_IsElevated = isElevated; if (isElevated) { this.Text = "RPCMon - RPC Monitor Based Windows Events (Administrator)"; } } } private void timer1_Tick(object sender, EventArgs e) { updatetoolStripStatusLabelTotalEvents(); } private void updatetoolStripStatusLabelTotalEvents() { m_TotalShownEvents = 0; foreach (DataGridViewRow row in this.dataGridView1.Rows) { if (row.Visible) { m_TotalShownEvents++; } } toolStripStatusLabelTotalEvents.Text = "Shown events: " + m_TotalShownEvents + "/" + m_TotalNumberOfEvents; } private void checkIdDBGHelpExist() { if (!File.Exists(Engine.DbgHelpFilePath)) { MessageBox.Show("Can't find DbgHelp file: " + Engine.DbgHelpFilePath + ".\nGo to \"Option | Set DbgHelp File Path\" and set it.", "DbgHelp File Path"); } } private string getDBFromCurrentFolder() { string dbFile = "** No DataBase File ! **"; string currentFolder = Directory.GetCurrentDirectory(); string[] files = Directory.GetFiles(currentFolder); foreach (string file in files) { if (file.EndsWith(".rpcdb.json")) { dbFile = file; break; } } return dbFile; } public static string getFunctionName(string uuid, int i_functionID) { try { var value = m_RPCDB[uuid][RPC_DB_KEY_Procedures]; List list = value.ToObject>(); return list[i_functionID]; } catch { return NA_STRING; } } private void dummRowsForDebug() { DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dataGridView1); //row.Cells[(int)Utils.eColumnNames.PID].Value = "1234"; //row.Cells[(int)Utils.eColumnNames.TID].Value = "543"; //row.Cells[(int)Utils.eColumnNames.UUID].Value = ""; //row.Cells[(int)Utils.eColumnNames.Function].Value = "func1"; //row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "Process1"; //row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = "n1"; //row.Cells[(int)Utils.eColumnNames.Protocol].Value = "protocol1"; //row.Cells[(int)Utils.eColumnNames.Endpoint].Value = "endpoint1"; //row.Cells[(int)Utils.eColumnNames.Options].Value = "option1"; //row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = "auth1"; //row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = "authS1"; //row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = "imper1"; //row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); //dataGridView1.Rows.Add(row); //for (int i = 0; i < 16000; i++) //{ // row = new DataGridViewRow(); // row.CreateCells(dataGridView1); // row.Cells[(int)Utils.eColumnNames.PID].Value = "654"; // row.Cells[(int)Utils.eColumnNames.TID].Value = "222"; // row.Cells[(int)Utils.eColumnNames.UUID].Value = ""; // row.Cells[(int)Utils.eColumnNames.Function].Value = "func2"; // row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "Process2"; // row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = "n2"; // row.Cells[(int)Utils.eColumnNames.Protocol].Value = "protocol2"; // row.Cells[(int)Utils.eColumnNames.Endpoint].Value = "endpoint2"; // row.Cells[(int)Utils.eColumnNames.Options].Value = "option2"; // row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = "auth2"; // row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = "authS2"; // row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = "imper2"; // row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); // dataGridView1.Rows.Add(row); //} row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells[(int)Utils.eColumnNames.PID].Value = "1"; row.Cells[(int)Utils.eColumnNames.TID].Value = "222"; row.Cells[(int)Utils.eColumnNames.UUID].Value = ""; row.Cells[(int)Utils.eColumnNames.Function].Value = "a"; row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "Process2"; row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = "n2"; row.Cells[(int)Utils.eColumnNames.Protocol].Value = "protocol2"; row.Cells[(int)Utils.eColumnNames.Endpoint].Value = "endpoint2"; row.Cells[(int)Utils.eColumnNames.Options].Value = "option2"; row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = "auth2"; row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = "authS2"; row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = "imper2"; row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); dataGridView1.Rows.Add(row); row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells[(int)Utils.eColumnNames.PID].Value = "2"; row.Cells[(int)Utils.eColumnNames.TID].Value = "222"; row.Cells[(int)Utils.eColumnNames.UUID].Value = ""; row.Cells[(int)Utils.eColumnNames.Function].Value = "a"; row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "Process2"; row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = "n2"; row.Cells[(int)Utils.eColumnNames.Protocol].Value = "protocol2"; row.Cells[(int)Utils.eColumnNames.Endpoint].Value = "endpoint2"; row.Cells[(int)Utils.eColumnNames.Options].Value = "option2"; row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = "auth2"; row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = "authS2"; row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = "imper2"; row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); dataGridView1.Rows.Add(row); row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells[(int)Utils.eColumnNames.PID].Value = "1"; row.Cells[(int)Utils.eColumnNames.TID].Value = "222"; row.Cells[(int)Utils.eColumnNames.UUID].Value = ""; row.Cells[(int)Utils.eColumnNames.Function].Value = "b"; row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "Process2"; row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = "n2"; row.Cells[(int)Utils.eColumnNames.Protocol].Value = "protocol2"; row.Cells[(int)Utils.eColumnNames.Endpoint].Value = "endpoint2"; row.Cells[(int)Utils.eColumnNames.Options].Value = "option2"; row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = "auth2"; row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = "authS2"; row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = "imper2"; row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); dataGridView1.Rows.Add(row); row = new DataGridViewRow(); row.CreateCells(dataGridView1); row.Cells[(int)Utils.eColumnNames.PID].Value = "3"; row.Cells[(int)Utils.eColumnNames.TID].Value = "222"; row.Cells[(int)Utils.eColumnNames.UUID].Value = ""; row.Cells[(int)Utils.eColumnNames.Function].Value = "a"; row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "Process2"; row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = "n2"; row.Cells[(int)Utils.eColumnNames.Protocol].Value = "protocol2"; row.Cells[(int)Utils.eColumnNames.Endpoint].Value = "endpoint2"; row.Cells[(int)Utils.eColumnNames.Options].Value = "option2"; row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = "auth2"; row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = "authS2"; row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = "imper2"; row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); dataGridView1.Rows.Add(row); } private void startEventTracing() { if (File.Exists(m_RPCDBPath)) { string jsonText = File.ReadAllText(m_RPCDBPath); m_RPCDB = JsonConvert.DeserializeObject>>(jsonText); } else { m_RPCDB = new Dictionary>(); } //filterRowsByFilterRules(highLightListView, highLightFormName); using (var session = new TraceEventSession("MySimpleSession")) { m_TraceSession = session; session.EnableProvider("Microsoft-Windows-RPC", Microsoft.Diagnostics.Tracing.TraceEventLevel.Verbose); var parser = new MicrosoftWindowsRPCTraceEventParser(session.Source); if (m_IncludeEvents[(int)Utils.eEvents.ServerStart]) { parser.RpcServerCallStart += e2 => { EventWrapper eventWrapper = new EventWrapper(e2); addEventToDataGridView(eventWrapper); }; } if (m_IncludeEvents[(int)Utils.eEvents.ClientStart]) { parser.RpcClientCallStart += e2 => { EventWrapper eventWrapper = new EventWrapper(e2); addEventToDataGridView(eventWrapper); }; } if (m_IncludeEvents[(int)Utils.eEvents.ClientStop]) { parser.RpcClientCallStop7 += e2 => { EventWrapper eventWrapper = new EventWrapper(e2); addEventToDataGridView(eventWrapper); }; } if (m_IncludeEvents[(int)Utils.eEvents.ServerStop]) { parser.RpcServerCallStop += e2 => { EventWrapper eventWrapper = new EventWrapper(e2); addEventToDataGridView(eventWrapper); }; } session.Source.Process(); } } private void setRpcFields(ref DataGridViewRow i_Row, string i_UUID) { if (m_RPCDB.ContainsKey(i_UUID)) { i_Row.Cells[(int)Utils.eColumnNames.Module].Value = m_RPCDB[i_UUID][RPC_DB_KEY_Module] ?? NA_STRING; i_Row.Cells[(int)Utils.eColumnNames.ModulePath].Value = m_RPCDB[i_UUID][RPC_DB_KEY_ModulePath] ?? NA_STRING; i_Row.Cells[(int)Utils.eColumnNames.ProceduresCount].Value = m_RPCDB[i_UUID][RPC_DB_KEY_ProceduresCount] ?? NA_STRING; i_Row.Cells[(int)Utils.eColumnNames.Service].Value = m_RPCDB[i_UUID][RPC_DB_KEY_Service] ?? NA_STRING; } else { i_Row.Cells[(int)Utils.eColumnNames.Module].Value = NA_STRING; i_Row.Cells[(int)Utils.eColumnNames.ModulePath].Value = NA_STRING; i_Row.Cells[(int)Utils.eColumnNames.ProceduresCount].Value = NA_STRING; i_Row.Cells[(int)Utils.eColumnNames.Service].Value = NA_STRING; } } // https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls?view=netdesktop-6.0 private delegate void addEventToDataGridViewCallBack(EventWrapper i_Event); private void addEventToDataGridView(EventWrapper i_Event) { if (this.InvokeRequired) { addEventToDataGridViewCallBack s = new addEventToDataGridViewCallBack(addEventToDataGridView); this.Invoke(s, i_Event); } else { string funcName = getFunctionName(i_Event.InterfaceUuid.ToString(), i_Event.ProcNum); //DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone(); DataGridViewRow row = new DataGridViewRow(); row.CreateCells(dataGridView1); //dataGridView1.Rows.Add(cells); //dataGridView1.Rows[0].Cells[0].Value = ""; row.Cells[(int)Utils.eColumnNames.PID].Value = i_Event.ProcessID.ToString(); row.Cells[(int)Utils.eColumnNames.TID].Value = i_Event.ThreadID.ToString(); setProcessName(i_Event, ref row); row.Cells[(int)Utils.eColumnNames.UUID].Value = i_Event.InterfaceUuid.ToString(); if (i_Event.InterfaceUuid.ToString() != null && i_Event.InterfaceUuid.ToString() != "") { setRpcFields(ref row, i_Event.InterfaceUuid.ToString()); } row.Cells[(int)Utils.eColumnNames.Function].Value = funcName; row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = i_Event.NetworkAddress; row.Cells[(int)Utils.eColumnNames.Protocol].Value = i_Event.Protocol; row.Cells[(int)Utils.eColumnNames.Endpoint].Value = i_Event.Endpoint; row.Cells[(int)Utils.eColumnNames.TimeStamp].Value = i_Event.TimeStamp; row.Cells[(int)Utils.eColumnNames.Task].Value = i_Event.TaskName; row.Cells[(int)Utils.eColumnNames.Options].Value = i_Event.Options.ToString(); row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = i_Event.AuthenticationLevel.ToString(); row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = i_Event.AuthenticationService.ToString(); row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = i_Event.ImpersonationLevel.ToString(); row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); dataGridView1.Rows.Add(row); if (!m_IncludeHighlightDict.Count.Equals(0) || !m_ExcludeHighlightDict.Count.Equals(0)) { filterSingleRowByFilterRules(Utils.eFormNames.FormHighlighFilter, row); } if (!m_IncludeFilterDict.Count.Equals(0) || !m_ExcludeFilterDict.Count.Equals(0)) { filterSingleRowByFilterRules(Utils.eFormNames.FormColumnFilter, row); } if (row.Visible && autoScroll) dataGridView1.FirstDisplayedCell = row.Cells[(int)Utils.eColumnNames.ImpersonationLevel]; this.m_TotalNumberOfEvents += 1; //this.toolStripStatusLabelTotalEvents.Text = "Total events: " + this.m_TotalNumberOfEvents; } } //private void addEventToDataGridView(Microsoft.Diagnostics.Tracing.Parsers.MicrosoftWindowsRPC.RpcClientCallStartArgs_V1TraceData i_Event) //{ // if (this.InvokeRequired) // { // addEventToDataGridViewCallBack s = new addEventToDataGridViewCallBack(addEventToDataGridView); // this.Invoke(s, i_Event); // } // else // { // string funcName = getFunctionName(i_Event.InterfaceUuid.ToString(), i_Event.ProcNum); // //DataGridViewRow row = (DataGridViewRow)dataGridView1.Rows[0].Clone(); // DataGridViewRow row = new DataGridViewRow(); // row.CreateCells(dataGridView1); // //dataGridView1.Rows.Add(cells); // //dataGridView1.Rows[0].Cells[0].Value = ""; // row.Cells[(int)Utils.eColumnNames.PID].Value = i_Event.ProcessID.ToString(); // row.Cells[(int)Utils.eColumnNames.TID].Value = i_Event.ThreadID.ToString(); // setProcessName(i_Event, ref row); // row.Cells[(int)Utils.eColumnNames.UUID].Value = i_Event.InterfaceUuid.ToString(); // if (i_Event.InterfaceUuid.ToString() != null && i_Event.InterfaceUuid.ToString() != "") // { // setRpcFields(ref row, i_Event.InterfaceUuid.ToString()); // } // row.Cells[(int)Utils.eColumnNames.Function].Value = funcName; // row.Cells[(int)Utils.eColumnNames.NetworkAddress].Value = i_Event.NetworkAddress.ToString(); // row.Cells[(int)Utils.eColumnNames.Protocol].Value = i_Event.Protocol.ToString(); // row.Cells[(int)Utils.eColumnNames.Endpoint].Value = i_Event.Endpoint.ToString(); // row.Cells[(int)Utils.eColumnNames.TimeStamp].Value = i_Event.TimeStamp.ToString("dd/MMM/yyyy hh:mm:ss.fff tt"); // row.Cells[(int)Utils.eColumnNames.Options].Value = i_Event.Options.ToString(); // row.Cells[(int)Utils.eColumnNames.AuthenticationLevel].Value = i_Event.AuthenticationLevel.ToString(); // row.Cells[(int)Utils.eColumnNames.AuthenticationService].Value = i_Event.AuthenticationService.ToString(); // row.Cells[(int)Utils.eColumnNames.ImpersonationLevel].Value = i_Event.ImpersonationLevel.ToString(); // row.DefaultCellStyle.Font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); // dataGridView1.Rows.Add(row); // if (!m_IncludeHighlightDict.Count.Equals(0) || !m_ExcludeHighlightDict.Count.Equals(0)) // { // filterSingleRowByFilterRules(Utils.eFormNames.FormHighlighFilter, row); // } // if (!m_IncludeFilterDict.Count.Equals(0) || !m_ExcludeFilterDict.Count.Equals(0)) // { // filterSingleRowByFilterRules(Utils.eFormNames.FormColumnFilter, row); // } // if (row.Visible && autoScroll) // dataGridView1.FirstDisplayedCell = row.Cells[(int)Utils.eColumnNames.ImpersonationLevel]; // this.m_TotalNumberOfEvents += 1; // //this.toolStripStatusLabelTotalEvents.Text = "Total events: " + this.m_TotalNumberOfEvents; // } //} private void setProcessName(EventWrapper i_Event, ref DataGridViewRow row) { if (i_Event.ProcessName == "") { if (m_ProcessPIDsDictionary.ContainsKey(i_Event.ProcessID)) { row.Cells[(int)Utils.eColumnNames.ProcessName].Value = m_ProcessPIDsDictionary[i_Event.ProcessID]; } else { try { using (var p = Process.GetProcessById(i_Event.ProcessID)) { row.Cells[(int)Utils.eColumnNames.ProcessName].Value = p.ProcessName; m_ProcessPIDsDictionary.Add(p.Id, p.ProcessName); } } catch { row.Cells[(int)Utils.eColumnNames.ProcessName].Value = "N\\A"; m_ProcessPIDsDictionary.Add(i_Event.ProcessID, "N\\A"); } } } else { row.Cells[(int)Utils.eColumnNames.ProcessName].Value = i_Event.ProcessName; } } private void toolStripButtonStart_Click(object sender, EventArgs e) { if (!m_IsCaptureButtonPressed) { dataGridView1.Visible = true; pictureBox1.Visible = false; toolStripButtonStart.Image = global::RPCMon.Properties.Resources.pause_button; m_IsCaptureButtonPressed = true; m_CaptureThread = new Thread(new ThreadStart(startEventTracing)); m_CaptureThread.Start(); m_Timer.Start(); } else { toolStripButtonStart.Image = global::RPCMon.Properties.Resources.startIcon; m_IsCaptureButtonPressed = false; m_TraceSession.Source.StopProcessing(); m_TraceSession.Dispose(); m_CaptureThread.Abort(); m_Timer.Stop(); updatetoolStripStatusLabelTotalEvents(); } } private void toolStripButtonAutoScroll_Click(object sender, EventArgs e) { if (autoScroll) { autoScroll = false; toolStripButtonAutoScroll.Image = global::RPCMon.Properties.Resources.scroll_disable; } else { autoScroll = true; toolStripButtonAutoScroll.Image = global::RPCMon.Properties.Resources.scroll; } } /*private void toolStripButtonStop_Click(object sender, EventArgs e) { m_TraceSession.Source.StopProcessing(); m_TraceSession.Dispose(); }*/ private void toolStripButtonFilter_Click(object sender, EventArgs e) { openColumnFilterWindow(); } private void openColumnFilterWindow() { if (!m_IsColumnFilterFormOpen) { //ColumnFilter m_FormColumnFilter = new ColumnFilter(listView1); // ColumnFilter m_FormColumnFilter = new ColumnFilter(ref dataGridView1); m_FormColumnFilter = new ColumnFilter(ref m_filterListView); m_FormColumnFilter.FilterOKUpdate += new FilterOKEventHandler(ColumnFilter_OKFilter); m_FormColumnFilter.FormClosed += columnFilter_FormClosed; m_IsColumnFilterFormOpen = true; m_FormColumnFilter.Show(); } else { m_FormColumnFilter.Activate(); } } private void columnFilter_FormClosed(object sender, FormClosedEventArgs e) { m_IsColumnFilterFormOpen = false; // Reset the flag when the form is closed } private void openColumnSelectionWindow() { //ColumnFilter m_FormColumnFilter = new ColumnFilter(listView1); ColumnSelection columnSelection = new ColumnSelection(dataGridView1); columnSelection.selectColumnsUpdate += new selectColumnsEventHandler(this.ColumnSelection_selectColumnsUpdate); columnSelection.ShowDialog(); } private void openFindWindow() { if (!m_IsFindFormOpen) { m_FormFindWindow = new FormSearch(); m_FormFindWindow.searchForMatch += new searchEventHandler(FindWindow_searchForMatch); m_FormFindWindow.FormClosed += findWindow_FormClosed; m_IsFindFormOpen = true; m_FormFindWindow.Show(); } else { m_FormFindWindow.Activate(); } } private void findWindow_FormClosed(object sender, FormClosedEventArgs e) { m_IsFindFormOpen = false; } private void openHighlightWindows() { if (!m_IsHighlightFormOpen) { m_FormHightlightWindow = new FormHighlighting(ref m_highLightListView); m_FormHightlightWindow.hightlightRowsUpdate += HightlightWindow_hightlightRowsUpdate; m_FormHightlightWindow.FormClosed += hightlight_FormClosed; m_IsHighlightFormOpen = true; m_FormHightlightWindow.Show(); } else { m_FormHightlightWindow.Activate(); } } private void hightlight_FormClosed(object sender, FormClosedEventArgs e) { m_IsHighlightFormOpen = false; // Reset the flag when the form is closed } private void buildDBToolStripMenuItem_Click(object sender, EventArgs e) { FormBuildDB buildDBForm = new FormBuildDB(); //m_FormHightlightWindow.hightlightRowsUpdate += HightlightWindow_hightlightRowsUpdate; buildDBForm.ShowDialog(); } private void HightlightWindow_hightlightRowsUpdate(ListView i_ListView) { m_highLightListView = Utils.CopyListView(i_ListView); updateFilterDicts(i_ListView, Utils.eFormNames.FormHighlighFilter); if (m_IncludeHighlightDict.Count.Equals(0)) { foreach (DataGridViewRow row in this.dataGridView1.Rows) { this.dataGridView1.Rows[row.Index].DefaultCellStyle.BackColor = Color.White; } return; } filterRowsByFilterRules(Utils.eFormNames.FormHighlighFilter); } private void cleanAllSelectedCells() { for (int i = 0; i < dataGridView1.SelectedCells.Count; i++) { dataGridView1.SelectedCells[i].Selected = false; } } private void FindWindow_searchForMatch(string i_SearchString, bool i_SearchDown, bool i_MatchWholeWord, bool i_MatchSensitive) { int startIndex = 0; m_LastSearchValue = i_SearchString; bool foundMatch = false; int step = 1; if (!i_SearchDown) { step = -1; } if (dataGridView1.SelectedRows != null && dataGridView1.SelectedRows.Count > 0) { DataGridViewRow selectedRow = dataGridView1.SelectedRows[0]; startIndex = selectedRow.Index; } if (dataGridView1.SelectedCells != null && dataGridView1.SelectedCells.Count > 0) { DataGridViewCell selectedCell = dataGridView1.SelectedCells[0]; startIndex = selectedCell.RowIndex; } startIndex += step; for (int i = startIndex; i < dataGridView1.Rows.Count; i += step) { if (i < 0) { break; } foreach (DataGridViewCell cell in dataGridView1.Rows[i].Cells) { if (dataGridView1.Rows[i].Visible && cell.Value != null && ((cell.Value.ToString().Contains(i_SearchString) && i_MatchSensitive)) || (cell.Value.ToString().ToLower().Contains(i_SearchString.ToLower()) && !i_MatchSensitive)) { cleanAllSelectedCells(); dataGridView1.Rows[i].Selected = true; foundMatch = true; dataGridView1.CurrentCell = dataGridView1.Rows[i].Cells[0]; break; } } if (foundMatch) { break; } } if (!foundMatch) { MessageBox.Show(string.Format("Cannot find string \"{0}\"", i_SearchString), "RPC Monitor", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } private void modifyColumnSelection(DataGridViewColumn i_Column, GroupBox i_GroupBox) { foreach (CheckBox checkBox in i_GroupBox.Controls) { if (checkBox.Text == i_Column.HeaderText) { if (checkBox.Checked) { dataGridView1.Columns[i_Column.Index].Visible = true; } else { dataGridView1.Columns[i_Column.Index].Visible = false; } } } } private void ColumnSelection_selectColumnsUpdate(GroupBox i_RPCClient, GroupBox i_RPCServer, GroupBox i_RPCMisc) { foreach (DataGridViewColumn column in dataGridView1.Columns) { modifyColumnSelection(column, i_RPCClient); modifyColumnSelection(column, i_RPCServer); modifyColumnSelection(column, i_RPCMisc); } } private void filterRowBasedOnForm(Utils.eFormNames i_FormName, int i_RowIndex, string i_Action) { if (i_FormName == Utils.eFormNames.FormColumnFilter) { this.dataGridView1.Rows[i_RowIndex].Visible = (i_Action == "Include"); } else { this.dataGridView1.Rows[i_RowIndex].DefaultCellStyle.BackColor = (i_Action == "Include") ? Color.Cyan : Color.White; } } private void hideFilterRowBasedOnForm(Utils.eFormNames i_FormName, int i_RowIndex) { if (i_FormName == Utils.eFormNames.FormColumnFilter) { this.dataGridView1.Rows[i_RowIndex].Visible = false; } else { this.dataGridView1.Rows[i_RowIndex].DefaultCellStyle.BackColor = Color.White; } } private bool checkIfShouldBeVisable(ListViewItem rule, DataGridViewRow row, String key) { //DataGridViewCell cellValueFromGridViewCell = row.Cells["Column" + rule.SubItems[0].Text]; string dataFromCell = row.Cells["Column" + rule.SubItems[0].Text].Value.ToString(); string lowerDataFromCell = dataFromCell.ToLower(); string valueFromFilter = rule.SubItems[(int)Utils.eFilterNames.Value].Text; string lowerValueFromFilter = valueFromFilter.ToLower(); bool matchCase = rule.SubItems[(int)Utils.eFilterNames.MatchCase].Text.Equals("True"); if (rule.SubItems[(int)Utils.eFilterNames.Relation].Text == "contains") { if ((dataFromCell.Contains(valueFromFilter) && matchCase) || (lowerDataFromCell.Contains(lowerValueFromFilter) && !matchCase)) { return true; } } else if (rule.SubItems[(int)Utils.eFilterNames.Relation].Text == "is") { if ((dataFromCell.Equals(valueFromFilter) && matchCase) || (lowerDataFromCell.Equals(lowerValueFromFilter) && !matchCase)) { return true; } } else if (rule.SubItems[(int)Utils.eFilterNames.Relation].Text == "begins with") { if ((dataFromCell.StartsWith(valueFromFilter) && matchCase) || (lowerDataFromCell.StartsWith(lowerValueFromFilter) && !matchCase)) { return true; } } else if (rule.SubItems[(int)Utils.eFilterNames.Relation].Text == "ends with") { if ((dataFromCell.EndsWith(valueFromFilter) && matchCase) || (lowerDataFromCell.EndsWith(lowerValueFromFilter) && !matchCase)) { return true; } } return false; } private void filterRow(Utils.eFormNames i_FormName, DataGridViewRow row, IDictionary> includeDict, IDictionary> excludeDict) { bool visable = false; foreach (var pair in excludeDict) { foreach (var rule in pair.Value) { if (checkIfShouldBeVisable(rule, row, pair.Key)) { hideFilterRowBasedOnForm(i_FormName, row.Index); return; } } } if (!excludeDict.Count.Equals(0)) { filterRowBasedOnForm(i_FormName, row.Index, "Include"); } foreach (var pair in includeDict) { foreach (var rule in pair.Value) { if (checkIfShouldBeVisable(rule, row, pair.Key)) { visable = true; break; } } if (!visable) { hideFilterRowBasedOnForm(i_FormName, row.Index); return; } visable = false; } if (!includeDict.Count.Equals(0)) { filterRowBasedOnForm(i_FormName, row.Index, "Include"); } } private void filterSingleRowByFilterRules(Utils.eFormNames i_FormName, DataGridViewRow row) { if(i_FormName == Utils.eFormNames.FormColumnFilter) { filterRow(i_FormName, row, m_IncludeFilterDict, m_ExcludeFilterDict); } else { filterRow(i_FormName, row, m_IncludeHighlightDict, m_ExcludeHighlightDict); } } private void addItemToFilterDict(ListViewItem rule, bool addToExcludeList, Utils.eFormNames i_FormName) { if(i_FormName == Utils.eFormNames.FormColumnFilter) { if (addToExcludeList) { if (!m_ExcludeFilterDict.ContainsKey(rule.SubItems[0].Text)) { m_ExcludeFilterDict.Add(rule.SubItems[0].Text, new List()); } m_ExcludeFilterDict[rule.SubItems[0].Text].Add(rule); } else { if (!m_IncludeFilterDict.ContainsKey(rule.SubItems[0].Text)) { m_IncludeFilterDict.Add(rule.SubItems[0].Text, new List()); } m_IncludeFilterDict[rule.SubItems[0].Text].Add(rule); } } else { if (addToExcludeList) { if (!m_ExcludeHighlightDict.ContainsKey(rule.SubItems[0].Text)) { m_ExcludeHighlightDict.Add(rule.SubItems[0].Text, new List()); } m_ExcludeHighlightDict[rule.SubItems[0].Text].Add(rule); } else { if (!m_IncludeHighlightDict.ContainsKey(rule.SubItems[0].Text)) { m_IncludeHighlightDict.Add(rule.SubItems[0].Text, new List()); } m_IncludeHighlightDict[rule.SubItems[0].Text].Add(rule); } } } private void updateFilterDicts(ListView i_ListView, Utils.eFormNames i_FormName) { if (i_FormName == Utils.eFormNames.FormColumnFilter) { m_IncludeFilterDict.Clear(); m_ExcludeFilterDict.Clear(); } else { m_IncludeHighlightDict.Clear(); m_ExcludeHighlightDict.Clear(); } foreach (ListViewItem rule in i_ListView.Items) { if (rule.Checked) { addItemToFilterDict(rule, rule.SubItems[(int)Utils.eFilterNames.Action].Text == "Exclude", i_FormName); } } } private void filterRowsByFilterRules(Utils.eFormNames i_FormName) { // TODO: What happens if one row is already Filtered\Highlight? It will hide it. Need to fix it // so there will be OR between the rules foreach (DataGridViewRow row in this.dataGridView1.Rows) { filterSingleRowByFilterRules(i_FormName, row); } if (!m_IsCaptureButtonPressed) { updatetoolStripStatusLabelTotalEvents(); } } private void ColumnFilter_OKFilter(ListView i_ListView) { m_filterListView = Utils.CopyListView(i_ListView); updateFilterDicts(i_ListView, Utils.eFormNames.FormColumnFilter); if (m_IncludeFilterDict.Count.Equals(0)) { foreach (DataGridViewRow row in this.dataGridView1.Rows) { row.Visible = true; } } filterRowsByFilterRules(Utils.eFormNames.FormColumnFilter); } protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { bool result = false; if (keyData == (Keys.Control | Keys.L)) { openColumnFilterWindow(); result = true; } else if (keyData == (Keys.Control | Keys.B)) { Font boldFont = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Bold); Font font = new Font(dataGridView1.DefaultCellStyle.Font, FontStyle.Regular); foreach (DataGridViewCell cell in dataGridView1.SelectedCells) { if (!dataGridView1.Rows[cell.RowIndex].DefaultCellStyle.Font.Bold) { font = boldFont; } dataGridView1.Rows[cell.RowIndex].DefaultCellStyle.Font = font; } foreach (DataGridViewRow selectedRow in dataGridView1.SelectedRows) { if (!selectedRow.DefaultCellStyle.Font.Bold) { font = boldFont; } dataGridView1.Rows[selectedRow.Index].DefaultCellStyle.Font = font; } result = true; } else if (keyData == (Keys.Control | Keys.F)) { openFindWindow(); result = true; } else if (keyData == (Keys.Control | Keys.H)) { openHighlightWindows(); result = true; } else if (keyData == (Keys.F3)) { // We need to implement the options for the search FindWindow_searchForMatch(m_LastSearchValue, true, false, false); } else if (keyData == (Keys.Shift | Keys.F3)) { // We need to implement the options for the search FindWindow_searchForMatch(m_LastSearchValue, false, false, false); } return result; } private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { openColumnSelectionWindow(); } } /// /// Right Click On Data Grid View /// /// /// private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e) { if(e.ColumnIndex.Equals(-1) || e.RowIndex.Equals(-1)) { return; } else if (e.Button == System.Windows.Forms.MouseButtons.Right) { m_CurrentRowIndexRightClick = e.RowIndex; m_CurrentColumnIndexRightClick = e.ColumnIndex; contextMenuStripRightClickGridView.Show(Cursor.Position.X, Cursor.Position.Y); autoScroll = false; if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null) { m_RightClickContent = new Tuple(dataGridView1.Columns[e.ColumnIndex].Name.Remove(0, 6), dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString()); ToolStripItem[] items = createNewToolStripMenuItem(e.RowIndex, e.ColumnIndex); } toolStripButtonAutoScroll.Image = global::RPCMon.Properties.Resources.scroll_disable; } } private ToolStripItem[] createNewToolStripMenuItem(int rowIndex, int columnIndex) { string cellValue = dataGridView1.Rows[rowIndex].Cells[columnIndex].Value.ToString(); ToolStripItem[] items = new ToolStripMenuItem[3]; ToolStripSeparator separator = new ToolStripSeparator(); contextMenuStripRightClickGridView.Items.Add(separator); items[0] = new ToolStripMenuItem("Include " + cellValue); items[1] = new ToolStripMenuItem("Exclude " + cellValue); items[2] = new ToolStripMenuItem("Highlight " + cellValue); items[0].Name = "Include"; items[1].Name = "Exclude"; items[2].Name = "Highlight"; items[0].Click += new EventHandler(includeFromStripMenu); items[1].Click += new EventHandler(excludeFromStripMenu); items[2].Click += new EventHandler(highlightFromStripMenu); foreach (var item in items) { contextMenuStripRightClickGridView.Items.Add(item); } return items; } private void highlightFromStripMenu(object sender, EventArgs e) { addItemToFilterListView("Highlight"); } private void excludeFromStripMenu(object sender, EventArgs e) { addItemToFilterListView("Exclude"); } private void includeFromStripMenu(object sender, EventArgs e) { addItemToFilterListView("Include"); } private void addItemToFilterListView(string option) { ListViewItem item = new ListViewItem(m_RightClickContent.Item1); item.SubItems.Add("is"); item.SubItems.Add(m_RightClickContent.Item2); item.Checked = true; item.SubItems.Add("True"); if (!option.Equals("Highlight")) { item.SubItems.Add(option); m_filterListView.Items.Add(item); ColumnFilter_OKFilter(m_filterListView); } else { item.SubItems.Add("Include"); m_highLightListView.Items.Add(item); HightlightWindow_hightlightRowsUpdate(m_highLightListView); } } private void copyRowToolStripMenuItem_Click(object sender, EventArgs e) { string copiedRow = ""; foreach (DataGridViewCell cell in dataGridView1.Rows[m_CurrentRowIndexRightClick].Cells) { copiedRow += cell.Value + " "; } if (copiedRow != "") { System.Windows.Forms.Clipboard.SetText(copiedRow); } } private void copyCellToolStripMenuItem_Click(object sender, EventArgs e) { string copiedCell = ""; if (dataGridView1.Rows[m_CurrentRowIndexRightClick] != null) { if (dataGridView1.Rows[m_CurrentRowIndexRightClick].Cells[m_CurrentColumnIndexRightClick].Value != null) { copiedCell = dataGridView1.Rows[m_CurrentRowIndexRightClick].Cells[m_CurrentColumnIndexRightClick].Value.ToString(); } } if (copiedCell != "") { System.Windows.Forms.Clipboard.SetText(copiedCell); } } private void toolStripButtonClear_Click(object sender, EventArgs e) { dataGridView1.Rows.Clear(); dataGridView1.Refresh(); m_TotalNumberOfEvents = 0; m_TotalShownEvents = 0; dataGridView1.Visible = false; pictureBox1.Visible = true; updatetoolStripStatusLabelTotalEvents(); } private void aboutToolStripMenuItem_Click(object sender, EventArgs e) { FormAbout formAbout = new FormAbout(); formAbout.ShowDialog(); } private void toolStripButtonFind_Click(object sender, EventArgs e) { openFindWindow(); } private void toolStripButtonHighlight_Click(object sender, EventArgs e) { openHighlightWindows(); } // Taken from https://stackoverflow.com/a/26259909/2153777 private void saveDataGridViewToCSV(string filename) { DataGridView tempDataGridView = dataGridView1; foreach (DataGridViewColumn column in tempDataGridView.Columns) { tempDataGridView.Columns[column.Index].Visible = true; } // Choose whether to write header. Use EnableWithoutHeaderText instead to omit header. tempDataGridView.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText; // Select all the cells tempDataGridView.SelectAll(); // Copy selected cells to DataObject DataObject dataObject = tempDataGridView.GetClipboardContent(); // Get the text of the DataObject, and serialize it to a file File.WriteAllText(filename, dataObject.GetText(TextDataFormat.CommaSeparatedValue)); } private void saveToolStripMenuItem_Click(object sender, EventArgs e) { SaveFileDialog saveDialog = new SaveFileDialog(); saveDialog.Title = "Save results as CSV"; saveDialog.InitialDirectory = @"c:\"; saveDialog.Filter = "CSV files (*.csv)|*.csv|All files (*.*)|*.*"; saveDialog.FilterIndex = 2; saveDialog.RestoreDirectory = true; if (saveDialog.ShowDialog() == DialogResult.OK) { saveDataGridViewToCSV(saveDialog.FileName); } } private void toolStripStatusLabelDBPath_MouseHover(object sender, EventArgs e) { toolTipDBPath.Show(this.m_RPCDBPath, this.statusStrip1, new Point(toolStripStatusLabelDBPath.Bounds.Left, toolStripStatusLabelDBPath.Bounds.Top + 20)); } private void toolStripStatusLabelDBPath_MouseLeave(object sender, EventArgs e) { toolTipDBPath.Hide(this.statusStrip1); } private void loadDBToolStripMenuItemLoadDB_Click(object sender, EventArgs e) { OpenFileDialog loadDBDialog = new OpenFileDialog(); loadDBDialog.Title = "Load RPC DataBase"; loadDBDialog.InitialDirectory = @"c:\"; loadDBDialog.Filter = "JSON files (*.json)|*.json|All files (*.*)|*.*"; loadDBDialog.FilterIndex = 1; loadDBDialog.RestoreDirectory = true; if (loadDBDialog.ShowDialog() == DialogResult.OK) { this.m_RPCDBPath = loadDBDialog.FileName; updateToolStripStatusLabelDBPath(loadDBDialog.FileName); } } private bool m_IsGridButtonPressed = false; private void toolStripButtonGrid_Click(object sender, EventArgs e) { if (!m_IsGridButtonPressed) { toolStripButtonGrid.Image = global::RPCMon.Properties.Resources.grid; m_IsGridButtonPressed = true; this.dataGridView1.AdvancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.None; } else { toolStripButtonGrid.Image = global::RPCMon.Properties.Resources.grid_disable; m_IsGridButtonPressed = false; this.dataGridView1.AdvancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single; } } private void hideOrShowAllRows(bool i_ShowAll) { foreach (DataGridViewRow row in dataGridView1.Rows) { if (i_ShowAll) { dataGridView1.Rows[row.Index].Visible = true; } else { dataGridView1.Rows[row.Index].Visible = false; } } } private bool m_IsRemoveDuplicateButtonPressed = false; private void toolStripButtonRemoveDuplicate_Click(object sender, EventArgs e) { if (!m_IsRemoveDuplicateButtonPressed) { toolStripButtonRemoveDuplicate.Image = global::RPCMon.Properties.Resources.duplicate; m_IsRemoveDuplicateButtonPressed = true; Dictionary dict = new Dictionary(); string rawRow; foreach (DataGridViewRow row in dataGridView1.Rows) { rawRow = ""; // Maybe can be reforma with the Copy function foreach (DataGridViewCell cell in dataGridView1.Rows[row.Index].Cells) { rawRow += cell.Value + " "; } if (!dict.ContainsKey(rawRow)) { dict.Add(rawRow, row.Index); } } hideOrShowAllRows(false); foreach (int index in dict.Values) { dataGridView1.Rows[index].Visible = true; } //https://stackoverflow.com/questions/28336370/how-to-remove-duplicate-row-from-datagridview-in-c //DataTable items = new DataTable(); //items.Columns.Add("PID"); //items.Columns.Add("TID"); //for (int i = 0; i < dataGridView1.Rows.Count; i++) //{ // DataRow rw = items.NewRow(); // rw[0] = dataGridView1.Rows[i].Cells[0].Value.ToString(); // rw[1] = dataGridView1.Rows[i].Cells[1].Value.ToString(); // var a = rw["PID"]; // if (!items.Rows.Cast().Any(row => row["PID"].Equals(rw["PID"]) && row["TID"].Equals(rw["TID"]))) // items.Rows.Add(rw); //} //dataGridView1.DataSource = items; } else { toolStripButtonRemoveDuplicate.Image = global::RPCMon.Properties.Resources.duplicate_disable; m_IsRemoveDuplicateButtonPressed = false; hideOrShowAllRows(true); } } private void setDbgHelpFilePathToolStripMenuItem_Click(object sender, EventArgs e) { FileDialog fileDialog = new OpenFileDialog(); fileDialog.Title = "Set DbgHelp File Path"; fileDialog.InitialDirectory = @"c:\"; fileDialog.Filter = "DLL files (*.dll)|*.dll|All files (*.*)|*.*"; fileDialog.FilterIndex = 1; fileDialog.RestoreDirectory = true; if (fileDialog.ShowDialog() == DialogResult.OK) { Engine.DbgHelpFilePath = fileDialog.FileName; } } private void Form1_Shown(object sender, EventArgs e) { checkIdDBGHelpExist(); } private void exportAllDataToolStripMenuItem_Click(object sender, EventArgs e) { string filePath = saveFilePath(); if (filePath == "") return; JArray data = new JArray(); foreach (DataGridViewRow row in dataGridView1.Rows) { addRowToJson(data, row, false); } string json = data.ToString(); File.WriteAllText(filePath, json); MessageBox.Show("Export Completed!"); } private void exportAsIsToolStripMenuItem_Click(object sender, EventArgs e) { string filePath = saveFilePath(); if(filePath == "") return; JArray data = new JArray(); foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.Visible) { addRowToJson(data, row, true); } } string json = data.ToString(); File.WriteAllText(filePath, json); MessageBox.Show("Export Completed!"); } private void addRowToJson(JArray data, DataGridViewRow row, bool exportAsIs) { JObject rowData = new JObject(); if (exportAsIs) { rowData["Highlighted"] = row.DefaultCellStyle.BackColor == Color.Cyan; rowData["Bold"] = row.DefaultCellStyle.Font.Bold; } foreach (DataGridViewColumn col in dataGridView1.Columns) { rowData[col.HeaderText] = (string)row.Cells[col.Index].Value; } data.Add(rowData); } private string saveFilePath() { string filePath = ""; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "JSON files|*.json"; saveFileDialog1.Title = "Save as JSON File"; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { filePath = saveFileDialog1.FileName; } return filePath; } private void importToolStripMenuItem1_Click(object sender, EventArgs e) { string fileName = ""; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Title = "Select a JSON file"; openFileDialog1.Filter = "JSON files|*.json"; if (openFileDialog1.ShowDialog() == DialogResult.OK) { fileName = openFileDialog1.FileName; } if(fileName == "") return; importFile(fileName); } private void importFile(string fileName) { dataGridView1.Visible = true; pictureBox1.Visible = false; int counter = 0; string json = File.ReadAllText(fileName); try { List> data = JsonConvert.DeserializeObject>>(json); foreach (Dictionary item in data) { DataGridViewRow row = new DataGridViewRow(); foreach (KeyValuePair pair in item) { counter++; if (pair.Key.Equals("Highlighted")) { row.DefaultCellStyle.BackColor = pair.Value.Equals(false) ? Color.White : Color.Cyan; continue; } else if (pair.Key.Equals("Bold")) { row.DefaultCellStyle.Font = pair.Value.Equals(true) ? new System.Drawing.Font(this.Font, FontStyle.Bold) : new System.Drawing.Font(this.Font, FontStyle.Regular); continue; } DataGridViewCell cell = new DataGridViewTextBoxCell(); cell.Value = pair.Value; row.Cells.Add(cell); } dataGridView1.Rows.Add(row); } } catch { MessageBox.Show("Invalid File!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } toolStripStatusLabelTotalEvents.Text = "Total events: " + counter + " | Shown events: " + counter; MessageBox.Show("Import Completed!", "Import Completed", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void dataGridView1_SelectionChanged(object sender, EventArgs e) { if (autoScroll && m_IsCaptureButtonPressed) { autoScroll = false; toolStripButtonAutoScroll.Image = global::RPCMon.Properties.Resources.scroll_disable; } int rowCount = 0; HashSet selectedRows = new HashSet(); foreach (DataGridViewCell cell in dataGridView1.SelectedCells) { selectedRows.Add(cell.RowIndex); } rowCount = selectedRows.Count; selectedEventsToolStrip.Text = "Selected events: " + rowCount; } private void Form1_Resize(object sender, EventArgs e) { Center_Picture(); } private void Center_Picture() { int x = (this.ClientSize.Width - pictureBox1.Width) / 2; int y = (this.ClientSize.Height - pictureBox1.Height) / 2; // Set the Location and Size of the PictureBox to center it pictureBox1.Location = new Point(x, y); } private void Form1_DragDrop(object sender, DragEventArgs e) { string[] fileList = (string[])e.Data.GetData(DataFormats.FileDrop, false); importFile(fileList[0]); } private void Form1_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.FileDrop)) { string[] filePaths = (string[])e.Data.GetData(DataFormats.FileDrop); string jsonString = File.ReadAllText(filePaths[0]); try { var obj = JsonConvert.DeserializeObject(jsonString); e.Effect = DragDropEffects.All; } catch (JsonException ex) { e.Effect = DragDropEffects.None; } } } private void showClientStartToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (m_IncludeEvents[(int)Utils.eEvents.ClientStart]) { m_IncludeEvents[(int)Utils.eEvents.ClientStart] = false; } else { m_IncludeEvents[(int)Utils.eEvents.ClientStart] = true; } optionsToolStripMenuItem.DropDown.Show(); } private void showServerStartToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (m_IncludeEvents[(int)Utils.eEvents.ServerStart]) { m_IncludeEvents[(int)Utils.eEvents.ServerStart] = false; } else { m_IncludeEvents[(int)Utils.eEvents.ServerStart] = true; } optionsToolStripMenuItem.DropDown.Show(); } private void showClientStopToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (m_IncludeEvents[(int)Utils.eEvents.ClientStop]) { m_IncludeEvents[(int)Utils.eEvents.ClientStop] = false; } else { m_IncludeEvents[(int)Utils.eEvents.ClientStop] = true; } optionsToolStripMenuItem.DropDown.Show(); } private void showServerStopToolStripMenuItem_CheckedChanged(object sender, EventArgs e) { if (m_IncludeEvents[(int)Utils.eEvents.ServerStop]) { m_IncludeEvents[(int)Utils.eEvents.ServerStop] = false; } else { m_IncludeEvents[(int)Utils.eEvents.ServerStop] = true; } optionsToolStripMenuItem.DropDown.Show(); } private void contextMenuStripRightClickGridView_Closing(object sender, ToolStripDropDownClosingEventArgs e) { if(contextMenuStripRightClickGridView.Items.Count < 3) { return; } for (int i = 0; i < 4; ++i) { contextMenuStripRightClickGridView.Items.RemoveAt(2); } } private void updateToolStripStatusLabelDBPath(string i_DBPath) { this.toolStripStatusLabelDBPath.Text = "DB File: " + Path.GetFileName(this.m_RPCDBPath); } } }