using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace ScreenConnect; public class TraceForm : TextBoxForm { private class AppDomainTraceManager : MarshalByRefObject { private class TraceListener : TraceListenerBase { private AppDomainTraceManager traceManager; public TraceListener(AppDomainTraceManager traceManager) { this.traceManager = traceManager.AssertArgumentNonNull("traceManager"); } public override void Write(string message) { traceManager.TryRaiseTraceWritten(message); } public override void WriteLine(string message) { Write(message + Environment.NewLine); } } private TraceListener traceListener; public event EventHandler TraceWritten; public AppDomainTraceManager() { traceListener = new TraceListener(this) { TraceOutputOptions = TraceOptions.DateTime }; } public override object InitializeLifetimeService() { return null; } public Dictionary GetTraceSources() { return Singleton.Instance.GetTraceSources().OfType().ToDictionary((DiagnosticsTraceSource _) => _.Name, (DiagnosticsTraceSource _) => (SourceLevels)_.GetLevel()); } public void SetTraceSourceLevel(string sourceName, SourceLevels level) { TraceSource traceSource = (from it in WindowsExtensions.GetFrameworkTraceSources().OfType() where it.Name == sourceName select it).FirstOrDefault() ?? new TraceSource(sourceName); traceSource.Switch.Level = level; if (traceSource.Switch.Level == SourceLevels.Off && traceSource.Listeners.Contains(traceListener)) { traceSource.Listeners.Remove(traceListener); } else if (traceSource.Switch.Level != SourceLevels.Off && !traceSource.Listeners.Contains(traceListener)) { traceSource.Listeners.Add(traceListener); } } private void TryRaiseTraceWritten(string message) { try { if (TraceWritten != null) { TraceWrittenEventArgs e = new TraceWrittenEventArgs { Message = message }; TraceWritten(this, e); } } catch { } } } [Serializable] private class TraceWrittenEventArgs : EventArgs { public string Message { get; set; } } private Dictionary traceManagerMap; private bool isPaused; public TraceForm() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown base._002Ector(); ((Control)this).Text = "Trace"; ((Control)this).Font = new Font(FontFamily.GenericMonospace, 8f); traceManagerMap = new Dictionary(); } public override object InitializeLifetimeService() { return null; } public void SetCurrentDomainTraceLevel(string sourceName, SourceLevels level) { GetTraceManager(AppDomain.CurrentDomain).SetTraceSourceLevel(sourceName, level); } protected override void OnKeyDown(KeyEventArgs e) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 base.OnKeyDown(e); if ((int)e.KeyCode == 115) { TogglePaused(); } } private void TogglePaused() { isPaused = !isPaused; } private AppDomainTraceManager GetTraceManager(AppDomain appDomain) { if (!traceManagerMap.TryGetValue(appDomain.Id, out var value)) { value = (AppDomainTraceManager)appDomain.CreateInstanceAndUnwrap(typeof(TraceForm).Assembly.FullName, typeof(AppDomainTraceManager).FullName); value.TraceWritten += OnTraceWritten; traceManagerMap[appDomain.Id] = value; } return value; } protected override void PopulateContextMenuStripItems(ContextMenuStrip contextMenuStrip) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) base.PopulateContextMenuStripItems(contextMenuStrip); ((ToolStrip)contextMenuStrip).Items.Add((ToolStripItem)new ToolStripMenuItem(isPaused ? "Unpause" : "Pause", (Image)null, (EventHandler)delegate { TogglePaused(); }, (Keys)115)); ((ToolStrip)contextMenuStrip).Items.Add((ToolStripItem)new ToolStripSeparator()); foreach (AppDomain appDomain in WindowsExtensions.GetAppDomains()) { try { AppDomainTraceManager traceManager = GetTraceManager(appDomain); ToolStripMenuItem val = (ToolStripMenuItem)((ToolStrip)contextMenuStrip).Items.Add(appDomain.FriendlyName); ((ToolStripItem)val).Tag = traceManager; foreach (KeyValuePair item in from _ in traceManager.GetTraceSources() orderby _.Key select _) { ToolStripMenuItem val2 = (ToolStripMenuItem)((ToolStripDropDownItem)val).DropDownItems.Add(item.Key); ((ToolStripItem)val2).Tag = item.Key; foreach (SourceLevels value in Enum.GetValues(typeof(SourceLevels))) { ToolStripMenuItem val3 = (ToolStripMenuItem)((ToolStripDropDownItem)val2).DropDownItems.Add(value.ToString()); ((ToolStripItem)val3).Tag = value; ((ToolStripItem)val3).Click += OnSourceLevelItemClick; val3.Checked = item.Value == value; } } } catch { } } } private void OnTraceWritten(object sender, TraceWrittenEventArgs e) { if (!isPaused) { Write(e.Message); } } private void OnSourceLevelItemClick(object sender, EventArgs e) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) ToolStripMenuItem val = (ToolStripMenuItem)sender; ToolStripMenuItem val2 = (ToolStripMenuItem)((ToolStripItem)val).OwnerItem; AppDomainTraceManager appDomainTraceManager = (AppDomainTraceManager)((ToolStripItem)(ToolStripMenuItem)((ToolStripItem)val2).OwnerItem).Tag; string sourceName = (string)((ToolStripItem)val2).Tag; SourceLevels level = (SourceLevels)((ToolStripItem)val).Tag; appDomainTraceManager.SetTraceSourceLevel(sourceName, level); } }