Minor encapsulation

This commit is contained in:
x1nixmzeng 2018-02-04 23:02:46 +00:00
parent 7768bfc784
commit fd6625f584
9 changed files with 990 additions and 421 deletions

View File

@ -74,6 +74,9 @@
<Compile Include="DebuggerSymbols\DebuggerSymbolProvider.cs" />
<Compile Include="Debugger\DebuggerSymbolServer.cs" />
<Compile Include="Debugger\DebuggerThread.cs" />
<Compile Include="DebugOutputManager.cs" />
<Compile Include="FileEventManager.cs" />
<Compile Include="FileWatchManager.cs" />
<Compile Include="Form1.cs">
<SubType>Form</SubType>
</Compile>
@ -170,6 +173,18 @@
<Name>cs_x86</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Resources\Pause_16x_24.bmp" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Run_16x_24.bmp" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\BreakpointEnable_16x_24.bmp" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\BreakpointDisable_16x_24.bmp" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View File

@ -0,0 +1,41 @@
// Written by x1nixmzeng for the Cxbx-Reloaded project
//
using System.Collections.Generic;
using System.Windows.Forms;
namespace CxbxDebugger
{
class DebugOutputManager
{
List<string> DebugInfo = new List<string>();
ListBox Handler;
public DebugOutputManager(ListBox Target)
{
Handler = Target;
}
private void RefreshUI()
{
// TODO: filter
}
public void AddLine(string Message)
{
DebugInfo.Add(Message);
if ( Handler.InvokeRequired)
{
Handler.Invoke(new MethodInvoker(delegate ()
{
Handler.Items.Insert(0, Message);
}));
}
else
{
Handler.Items.Insert(0, Message);
}
}
}
}

View File

@ -7,6 +7,7 @@ using System.Text;
using WinProcesses = VsChromium.Core.Win32.Processes;
using WinDebug = VsChromium.Core.Win32.Debugging;
using System.Runtime.InteropServices;
using WinLowLevel = LowLevelDesign.Win32.Windows.NativeMethods;
namespace CxbxDebugger
{
@ -165,32 +166,10 @@ namespace CxbxDebugger
if (bRet == true)
{
// Store these so they can be marshalled, and closed correctly
// TODO Move to Debugger* classes
// Store so they can be marshalled and closed correctly
hProcess = new WinProcesses.SafeProcessHandle(stProcessInfo.hProcess);
hThread = new WinProcesses.SafeThreadHandle(stProcessInfo.hThread);
var Process = new DebuggerProcess();
Process.Handle = stProcessInfo.hProcess;
Process.ProcessID = (uint)stProcessInfo.dwProcessId;
// Cxbx-Reloaded path
Process.Path = args[0].Trim(new char[] { '"' });
var Thread = new DebuggerThread(Process);
Thread.Handle = stProcessInfo.hThread;
Thread.ThreadID = NativeMethods.GetThreadId(Thread.Handle);
// Other thread properties are setup after CREATE_THREAD_DEBUG_EVENT is received
// Although the main thread is set here, it isn't registered in the Threads array at this point
Process.MainThread = Thread;
Process.Core = true;
DebugInstance = new DebuggerInstance(Process);
RegisterEventInterfaces(DebugInstance);
bContinue = true;
State = RunState.Running;
@ -206,7 +185,7 @@ namespace CxbxDebugger
const int bufSize = 1024;
var strPtr = Marshal.AllocHGlobal(bufSize);
uint length = LowLevelDesign.Win32.Windows.NativeMethods.GetFinalPathNameByHandleW
uint length = WinLowLevel.GetFinalPathNameByHandleW
(
FileHandle,
strPtr,
@ -285,6 +264,11 @@ namespace CxbxDebugger
{
var DebugInfo = DebugEvent.CreateThread;
if ((uint)DebugEvent.dwProcessId != DebugInstance.MainProcess.ProcessID)
{
throw new Exception("Handling event for unknown process");
}
var Process = DebugInstance.FindProcess((uint)DebugEvent.dwProcessId);
if (Process == null)
@ -307,11 +291,16 @@ namespace CxbxDebugger
{
var DebugInfo = DebugEvent.ExitThread;
var TargetThread = DebugInstance.MainProcess.FindThread((uint)DebugEvent.dwThreadId);
uint ExitCode = DebugInfo.dwExitCode;
if ((uint)DebugEvent.dwProcessId != DebugInstance.MainProcess.ProcessID)
{
throw new Exception("Handling event for unknown process");
}
var TargetThread = DebugInstance.MainProcess.FindThread((uint)DebugEvent.dwThreadId);
if (TargetThread != null)
{
uint ExitCode = DebugInfo.dwExitCode;
foreach (IDebuggerThreadEvents Event in ThreadEvents)
{
Event.OnThreadExit(TargetThread, ExitCode);
@ -319,56 +308,55 @@ namespace CxbxDebugger
}
}
const int VM_PLACEHOLDER_SIZE = 0x3FEF000;
const int XBE_IMAGE_BASE = 0x00010000;
private void HandleCreateProcess(WinDebug.DEBUG_EVENT DebugEvent)
{
var DebugInfo = DebugEvent.CreateProcessInfo;
// Check that this process is already registered, and update information about it
var Process = new DebuggerProcess();
var TargetProcess = DebugInstance.FindProcess((uint)DebugEvent.dwProcessId);
if( TargetProcess != null )
Process.Core = true;
Process.Handle = DebugInfo.hProcess;
Process.ProcessID = WinLowLevel.GetProcessId(Process.Handle);
Process.Path = ResolveProcessPath(DebugInfo.hFile);
// Skip over allocated Xbox memory
Process.ImageBase = DebugInfo.lpStartAddress + VM_PLACEHOLDER_SIZE;
var MainThread = new DebuggerThread(Process);
MainThread.Handle = DebugInfo.hThread;
MainThread.ThreadID = NativeMethods.GetThreadId(DebugInfo.hThread);
MainThread.ThreadBase = DebugInfo.lpThreadLocalBase;
// Setup as the main thread
// TODO Check that we need to treat this as a special case
Process.MainThread = MainThread;
DebugInstance = new DebuggerInstance(Process);
RegisterEventInterfaces(DebugInstance);
foreach (IDebuggerProcessEvents Event in ProcessEvents)
{
if( DebugInstance.MainProcess != TargetProcess )
{
throw new Exception("Attempting to add a child process with a registered PID");
}
// Update information about this process
var XboxModule = new DebuggerModule();
XboxModule.Path = Target;
XboxModule.ImageBase = new IntPtr(0x00010000); // XBE_IMAGE_BASE
XboxModule.Core = true;
foreach (IDebuggerModuleEvents Event in ModuleEvents)
{
Event.OnModuleLoaded(XboxModule);
}
// + VM_PLACEHOLDER_SIZE
TargetProcess.ImageBase = new IntPtr((uint)DebugInfo.lpBaseOfImage + 0x3FEF000);
// Update information about the main thread
//TargetProcess.MainThread.Handle = DebugInfo.hThread;
//TargetProcess.MainThread.ThreadID = (uint)DebugEvent.dwThreadId;
TargetProcess.MainThread.StartAddress = DebugInfo.lpStartAddress;
TargetProcess.MainThread.ThreadBase = DebugInfo.lpThreadLocalBase;
foreach (IDebuggerProcessEvents Event in ProcessEvents)
{
Event.OnProcessCreate(TargetProcess);
}
// Also message listeners about the existance of the main thread
foreach (IDebuggerThreadEvents Event in ThreadEvents)
{
Event.OnThreadCreate(TargetProcess.MainThread);
}
Event.OnProcessCreate(Process);
}
else
foreach (IDebuggerThreadEvents Event in ThreadEvents)
{
throw new Exception("CxbxDebugger does not support multiple process");
Event.OnThreadCreate(MainThread);
}
var XboxModule = new DebuggerModule();
XboxModule.Path = Target;
XboxModule.ImageBase = new IntPtr(XBE_IMAGE_BASE);
XboxModule.Core = true;
foreach (IDebuggerModuleEvents Event in ModuleEvents)
{
Event.OnModuleLoaded(XboxModule);
}
}
@ -376,6 +364,11 @@ namespace CxbxDebugger
{
var DebugInfo = DebugEvent.ExitProcess;
if ((uint)DebugEvent.dwProcessId != DebugInstance.MainProcess.ProcessID)
{
throw new Exception("Handling event for unknown process");
}
var TargetProcess = DebugInstance.FindProcess((uint)DebugEvent.dwProcessId);
uint ExitCode = DebugInfo.dwExitCode;
@ -392,6 +385,11 @@ namespace CxbxDebugger
{
var DebugInfo = DebugEvent.LoadDll;
if ((uint)DebugEvent.dwProcessId != DebugInstance.MainProcess.ProcessID)
{
throw new Exception("Handling event for unknown process");
}
var Module = new DebuggerModule();
Module.Path = ResolveProcessPath(DebugInfo.hFile);
@ -407,6 +405,11 @@ namespace CxbxDebugger
{
var DebugInfo = DebugEvent.UnloadDll;
if ((uint)DebugEvent.dwProcessId != DebugInstance.MainProcess.ProcessID)
{
throw new Exception("Handling event for unknown process");
}
var TargetModule = DebugInstance.MainProcess.Modules.Find(Module => Module.ImageBase == DebugInfo.lpBaseOfDll);
if (TargetModule != null)
@ -473,7 +476,6 @@ namespace CxbxDebugger
if (Thread != null)
{
var Report = DebuggerMessages.GetHLECacheReport(Thread, DebugInfo.ExceptionRecord.ExceptionInformation);
SetupHLECacheProvider(Report.FileName);
}
}
@ -637,7 +639,6 @@ namespace CxbxDebugger
break;
case WinDebug.DEBUG_EVENT_CODE.CREATE_PROCESS_DEBUG_EVENT:
// TODO: Limit support for multiple processes
HandleCreateProcess(DbgEvt);
break;

View File

@ -0,0 +1,61 @@
// Written by x1nixmzeng for the Cxbx-Reloaded project
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CxbxDebugger
{
enum FileEventType
{
Opened,
Read,
Write,
Closed,
FailedOpen,
}
struct FileEvents
{
public FileEventType Type;
public string Name;
public uint Length;
public uint Offset;
public FileEvents(FileEventType Type, string Name, uint Length = 0, uint Offset = uint.MaxValue)
{
this.Type = Type;
this.Name = Name;
this.Length = Length;
this.Offset = Offset;
}
public static FileEvents Opened(string Name)
{
return new FileEvents(FileEventType.Opened, Name);
}
public static FileEvents OpenedFailed(string Name)
{
return new FileEvents(FileEventType.FailedOpen, Name);
}
public static FileEvents Read(string Name, uint Length, uint Offset)
{
return new FileEvents(FileEventType.Read, Name, Length, Offset);
}
public static FileEvents Write(string Name, uint Length, uint Offset)
{
return new FileEvents(FileEventType.Write, Name, Length, Offset);
}
public static FileEvents Closed(string Name)
{
return new FileEvents(FileEventType.Closed, Name);
}
}
}

View File

@ -0,0 +1,80 @@
// Written by x1nixmzeng for the Cxbx-Reloaded project
//
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CxbxDebugger
{
class FileWatchInfo
{
public FileEventType Type;
public string Filter;
public bool Enabled;
}
class FileWatchManager
{
List<FileWatchInfo> WatchInfo = new List<FileWatchInfo>();
CheckedListBox Handler;
public FileWatchManager(CheckedListBox Target)
{
Handler = Target;
}
private void RefreshUI()
{
Handler.BeginUpdate();
Handler.Items.Clear();
foreach (FileWatchInfo Info in WatchInfo)
{
Handler.Items.Add(string.Format("Filter \"{0}\" with state {1}", Info.Filter, Info.Type), Info.Enabled);
}
Handler.EndUpdate();
}
public void Add(FileEventType Type, string Filter)
{
FileWatchInfo watch = new FileWatchInfo();
watch.Type = Type;
watch.Filter = Filter;
watch.Enabled = true;
WatchInfo.Add(watch);
RefreshUI();
}
public void SetEnabled(int Index, bool Value)
{
if (WatchInfo[Index].Enabled != Value)
{
WatchInfo[Index].Enabled = Value;
RefreshUI();
}
}
public void Delete(int Index)
{
WatchInfo.RemoveAt(Index);
RefreshUI();
}
public bool Match(FileEvents FileEvent)
{
var Result = WatchInfo.Find(
Info => Info.Enabled
&& FileEvent.Type == Info.Type
&& FileEvent.Name.Contains(Info.Filter));
return Result != null;
}
}
}

View File

@ -35,27 +35,40 @@
this.btnSuspend = new System.Windows.Forms.ToolStripButton();
this.btnResume = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.cbThreads = new System.Windows.Forms.ToolStripComboBox();
this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
this.cbFrames = new System.Windows.Forms.ToolStripComboBox();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage4 = new System.Windows.Forms.TabPage();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.statusBar = new System.Windows.Forms.StatusStrip();
this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.tabContainer = new System.Windows.Forms.TabControl();
this.tabDisassembly = new System.Windows.Forms.TabPage();
this.splitContainer2 = new System.Windows.Forms.SplitContainer();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.txDisassembly = new CxbxDebugger.RicherTextBox();
this.groupBox3 = new System.Windows.Forms.GroupBox();
this.btnDisassemble = new System.Windows.Forms.Button();
this.txDisassemblyAddr = new System.Windows.Forms.TextBox();
this.tabBreakpoints = new System.Windows.Forms.TabPage();
this.splitContainer3 = new System.Windows.Forms.SplitContainer();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.tbFileBit = new System.Windows.Forms.TextBox();
this.checkBox1 = new System.Windows.Forms.CheckBox();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.cbAction = new System.Windows.Forms.ComboBox();
this.label5 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.button1 = new System.Windows.Forms.Button();
this.tbFilter = new System.Windows.Forms.TextBox();
this.clbBreakpoints = new System.Windows.Forms.CheckedListBox();
this.tabWatch = new System.Windows.Forms.TabPage();
this.splitContainer1 = new System.Windows.Forms.SplitContainer();
this.lvFileDetails = new System.Windows.Forms.ListView();
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
this.lbOpenedFiles = new System.Windows.Forms.ListBox();
this.tabPage5 = new System.Windows.Forms.TabPage();
this.tabMemory = new System.Windows.Forms.TabPage();
this.splitContainer4 = new System.Windows.Forms.SplitContainer();
this.textBox1 = new System.Windows.Forms.TextBox();
this.txMemoryDump = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label1 = new System.Windows.Forms.Label();
this.btnDumpMemory = new System.Windows.Forms.Button();
@ -63,47 +76,54 @@
this.label2 = new System.Windows.Forms.Label();
this.btnReadMemory = new System.Windows.Forms.Button();
this.txSize = new System.Windows.Forms.TextBox();
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel();
this.tabOutput = new System.Windows.Forms.TabPage();
this.splitContainer5 = new System.Windows.Forms.SplitContainer();
this.txFilter = new System.Windows.Forms.TextBox();
this.label3 = new System.Windows.Forms.Label();
this.lbDebug = new System.Windows.Forms.ListBox();
this.diagSaveMemory = new System.Windows.Forms.SaveFileDialog();
this.disassemblyText = new CxbxDebugger.RicherTextBox();
this.cbFrames = new System.Windows.Forms.ToolStripComboBox();
this.toolStripLabel1 = new System.Windows.Forms.ToolStripLabel();
this.toolStripLabel2 = new System.Windows.Forms.ToolStripLabel();
this.toolStrip1.SuspendLayout();
this.tableLayoutPanel3.SuspendLayout();
this.tabControl1.SuspendLayout();
this.tabPage1.SuspendLayout();
this.statusBar.SuspendLayout();
this.tabContainer.SuspendLayout();
this.tabDisassembly.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit();
this.splitContainer2.Panel1.SuspendLayout();
this.splitContainer2.Panel2.SuspendLayout();
this.splitContainer2.SuspendLayout();
this.tabPage2.SuspendLayout();
this.groupBox3.SuspendLayout();
this.tabBreakpoints.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).BeginInit();
this.splitContainer3.Panel1.SuspendLayout();
this.splitContainer3.Panel2.SuspendLayout();
this.splitContainer3.SuspendLayout();
this.groupBox1.SuspendLayout();
this.tabPage3.SuspendLayout();
this.tabWatch.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit();
this.splitContainer1.Panel1.SuspendLayout();
this.splitContainer1.Panel2.SuspendLayout();
this.splitContainer1.SuspendLayout();
this.tabPage5.SuspendLayout();
this.tabMemory.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer4)).BeginInit();
this.splitContainer4.Panel1.SuspendLayout();
this.splitContainer4.Panel2.SuspendLayout();
this.splitContainer4.SuspendLayout();
this.groupBox2.SuspendLayout();
this.statusStrip1.SuspendLayout();
this.tabOutput.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.splitContainer5)).BeginInit();
this.splitContainer5.Panel1.SuspendLayout();
this.splitContainer5.Panel2.SuspendLayout();
this.splitContainer5.SuspendLayout();
this.SuspendLayout();
//
// lbConsole
//
this.lbConsole.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbConsole.FormattingEnabled = true;
this.lbConsole.Location = new System.Drawing.Point(3, 244);
this.lbConsole.Location = new System.Drawing.Point(3, 228);
this.lbConsole.Name = "lbConsole";
this.lbConsole.ScrollAlwaysVisible = true;
this.lbConsole.Size = new System.Drawing.Size(756, 55);
this.lbConsole.Size = new System.Drawing.Size(756, 50);
this.lbConsole.TabIndex = 2;
//
// toolStrip1
@ -128,10 +148,10 @@
//
// btnStart
//
this.btnStart.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.btnStart.Image = global::CxbxDebugger.Properties.Resources.run;
this.btnStart.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btnStart.Name = "btnStart";
this.btnStart.Size = new System.Drawing.Size(35, 22);
this.btnStart.Size = new System.Drawing.Size(51, 22);
this.btnStart.Text = "Start";
this.btnStart.Click += new System.EventHandler(this.toolStripButton1_Click);
//
@ -142,10 +162,10 @@
//
// btnSuspend
//
this.btnSuspend.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.btnSuspend.Image = global::CxbxDebugger.Properties.Resources.pause;
this.btnSuspend.ImageTransparentColor = System.Drawing.Color.Magenta;
this.btnSuspend.Name = "btnSuspend";
this.btnSuspend.Size = new System.Drawing.Size(56, 22);
this.btnSuspend.Size = new System.Drawing.Size(72, 22);
this.btnSuspend.Text = "Suspend";
this.btnSuspend.Click += new System.EventHandler(this.toolStripButton2_Click);
//
@ -163,6 +183,12 @@
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25);
//
// toolStripLabel1
//
this.toolStripLabel1.Name = "toolStripLabel1";
this.toolStripLabel1.Size = new System.Drawing.Size(47, 22);
this.toolStripLabel1.Text = "Thread:";
//
// cbThreads
//
this.cbThreads.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
@ -170,56 +196,78 @@
this.cbThreads.Size = new System.Drawing.Size(200, 25);
this.cbThreads.SelectedIndexChanged += new System.EventHandler(this.cbThreads_SelectedIndexChanged);
//
// toolStripLabel2
//
this.toolStripLabel2.Name = "toolStripLabel2";
this.toolStripLabel2.Size = new System.Drawing.Size(74, 22);
this.toolStripLabel2.Text = "Stack Frame:";
//
// cbFrames
//
this.cbFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbFrames.Name = "cbFrames";
this.cbFrames.Size = new System.Drawing.Size(200, 25);
this.cbFrames.SelectedIndexChanged += new System.EventHandler(this.cbFrames_SelectedIndexChanged);
//
// tableLayoutPanel3
//
this.tableLayoutPanel3.ColumnCount = 1;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel3.Controls.Add(this.tabControl1, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.statusBar, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.tabContainer, 0, 0);
this.tableLayoutPanel3.Controls.Add(this.lbConsole, 0, 1);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 25);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 2;
this.tableLayoutPanel3.RowCount = 3;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 80F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(762, 302);
this.tableLayoutPanel3.TabIndex = 9;
//
// tabControl1
// statusBar
//
this.tabControl1.Controls.Add(this.tabPage4);
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Controls.Add(this.tabPage5);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(3, 3);
this.tabControl1.Multiline = true;
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(756, 235);
this.tabControl1.TabIndex = 3;
this.statusBar.Dock = System.Windows.Forms.DockStyle.Fill;
this.statusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lblStatus});
this.statusBar.Location = new System.Drawing.Point(0, 281);
this.statusBar.Name = "statusBar";
this.statusBar.Size = new System.Drawing.Size(762, 21);
this.statusBar.TabIndex = 10;
this.statusBar.Text = "statusStrip1";
//
// tabPage4
// lblStatus
//
this.tabPage4.Location = new System.Drawing.Point(4, 22);
this.tabPage4.Name = "tabPage4";
this.tabPage4.Padding = new System.Windows.Forms.Padding(3);
this.tabPage4.Size = new System.Drawing.Size(748, 209);
this.tabPage4.TabIndex = 3;
this.tabPage4.Text = "Xbe Info";
this.tabPage4.UseVisualStyleBackColor = true;
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(39, 16);
this.lblStatus.Text = "Ready";
//
// tabPage1
// tabContainer
//
this.tabPage1.Controls.Add(this.splitContainer2);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(748, 209);
this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "Disassembly";
this.tabPage1.UseVisualStyleBackColor = true;
this.tabContainer.Controls.Add(this.tabDisassembly);
this.tabContainer.Controls.Add(this.tabBreakpoints);
this.tabContainer.Controls.Add(this.tabWatch);
this.tabContainer.Controls.Add(this.tabMemory);
this.tabContainer.Controls.Add(this.tabOutput);
this.tabContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabContainer.Location = new System.Drawing.Point(3, 3);
this.tabContainer.Multiline = true;
this.tabContainer.Name = "tabContainer";
this.tabContainer.SelectedIndex = 0;
this.tabContainer.Size = new System.Drawing.Size(756, 219);
this.tabContainer.TabIndex = 3;
//
// tabDisassembly
//
this.tabDisassembly.Controls.Add(this.splitContainer2);
this.tabDisassembly.Location = new System.Drawing.Point(4, 22);
this.tabDisassembly.Name = "tabDisassembly";
this.tabDisassembly.Padding = new System.Windows.Forms.Padding(3);
this.tabDisassembly.Size = new System.Drawing.Size(748, 193);
this.tabDisassembly.TabIndex = 0;
this.tabDisassembly.Text = "Disassembly";
this.tabDisassembly.UseVisualStyleBackColor = true;
//
// splitContainer2
//
@ -229,21 +277,69 @@
//
// splitContainer2.Panel1
//
this.splitContainer2.Panel1.Controls.Add(this.disassemblyText);
this.splitContainer2.Size = new System.Drawing.Size(742, 203);
this.splitContainer2.SplitterDistance = 550;
this.splitContainer2.Panel1.Controls.Add(this.txDisassembly);
//
// splitContainer2.Panel2
//
this.splitContainer2.Panel2.Controls.Add(this.groupBox3);
this.splitContainer2.Size = new System.Drawing.Size(742, 187);
this.splitContainer2.SplitterDistance = 519;
this.splitContainer2.TabIndex = 2;
//
// tabPage2
// txDisassembly
//
this.tabPage2.Controls.Add(this.splitContainer3);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(748, 209);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "Breakpoints";
this.tabPage2.UseVisualStyleBackColor = true;
this.txDisassembly.BackColor = System.Drawing.SystemColors.Window;
this.txDisassembly.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.txDisassembly.Cursor = System.Windows.Forms.Cursors.Default;
this.txDisassembly.Dock = System.Windows.Forms.DockStyle.Fill;
this.txDisassembly.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txDisassembly.Location = new System.Drawing.Point(0, 0);
this.txDisassembly.Name = "txDisassembly";
this.txDisassembly.ReadOnly = true;
this.txDisassembly.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;
this.txDisassembly.Size = new System.Drawing.Size(519, 187);
this.txDisassembly.TabIndex = 1;
this.txDisassembly.Text = "";
//
// groupBox3
//
this.groupBox3.Controls.Add(this.btnDisassemble);
this.groupBox3.Controls.Add(this.txDisassemblyAddr);
this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox3.Location = new System.Drawing.Point(0, 0);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(219, 187);
this.groupBox3.TabIndex = 0;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Disassemble Address";
//
// btnDisassemble
//
this.btnDisassemble.Location = new System.Drawing.Point(6, 45);
this.btnDisassemble.Name = "btnDisassemble";
this.btnDisassemble.Size = new System.Drawing.Size(207, 23);
this.btnDisassemble.TabIndex = 1;
this.btnDisassemble.Text = "Go";
this.btnDisassemble.UseVisualStyleBackColor = true;
this.btnDisassemble.Click += new System.EventHandler(this.button1_Click_1);
//
// txDisassemblyAddr
//
this.txDisassemblyAddr.Location = new System.Drawing.Point(6, 19);
this.txDisassemblyAddr.Name = "txDisassemblyAddr";
this.txDisassemblyAddr.Size = new System.Drawing.Size(207, 20);
this.txDisassemblyAddr.TabIndex = 0;
//
// tabBreakpoints
//
this.tabBreakpoints.Controls.Add(this.splitContainer3);
this.tabBreakpoints.Location = new System.Drawing.Point(4, 22);
this.tabBreakpoints.Name = "tabBreakpoints";
this.tabBreakpoints.Padding = new System.Windows.Forms.Padding(3);
this.tabBreakpoints.Size = new System.Drawing.Size(748, 193);
this.tabBreakpoints.TabIndex = 1;
this.tabBreakpoints.Text = "Breakpoints";
this.tabBreakpoints.UseVisualStyleBackColor = true;
//
// splitContainer3
//
@ -253,52 +349,104 @@
//
// splitContainer3.Panel1
//
this.splitContainer3.Panel1.Controls.Add(this.groupBox4);
this.splitContainer3.Panel1.Controls.Add(this.groupBox1);
this.splitContainer3.Size = new System.Drawing.Size(742, 203);
//
// splitContainer3.Panel2
//
this.splitContainer3.Panel2.Controls.Add(this.clbBreakpoints);
this.splitContainer3.Size = new System.Drawing.Size(742, 187);
this.splitContainer3.SplitterDistance = 247;
this.splitContainer3.TabIndex = 5;
//
// groupBox4
//
this.groupBox4.Location = new System.Drawing.Point(2, 112);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(241, 59);
this.groupBox4.TabIndex = 5;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "Memory";
//
// groupBox1
//
this.groupBox1.Controls.Add(this.tbFileBit);
this.groupBox1.Controls.Add(this.checkBox1);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Controls.Add(this.cbAction);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.button1);
this.groupBox1.Controls.Add(this.tbFilter);
this.groupBox1.Location = new System.Drawing.Point(0, 0);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(247, 203);
this.groupBox1.Size = new System.Drawing.Size(247, 106);
this.groupBox1.TabIndex = 4;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "File Access Breakpoint";
this.groupBox1.Text = "File Watch";
//
// tbFileBit
// cbAction
//
this.tbFileBit.Location = new System.Drawing.Point(6, 19);
this.tbFileBit.Name = "tbFileBit";
this.tbFileBit.Size = new System.Drawing.Size(235, 20);
this.tbFileBit.TabIndex = 2;
this.cbAction.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbAction.FormattingEnabled = true;
this.cbAction.Location = new System.Drawing.Point(95, 45);
this.cbAction.Name = "cbAction";
this.cbAction.Size = new System.Drawing.Size(146, 21);
this.cbAction.TabIndex = 6;
//
// checkBox1
// label5
//
this.checkBox1.AutoSize = true;
this.checkBox1.Checked = true;
this.checkBox1.CheckState = System.Windows.Forms.CheckState.Checked;
this.checkBox1.Location = new System.Drawing.Point(6, 45);
this.checkBox1.Name = "checkBox1";
this.checkBox1.Size = new System.Drawing.Size(181, 17);
this.checkBox1.TabIndex = 3;
this.checkBox1.Text = "Suspend when this file is opened";
this.checkBox1.UseVisualStyleBackColor = true;
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(6, 48);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(37, 13);
this.label5.TabIndex = 5;
this.label5.Text = "Action";
//
// tabPage3
// label4
//
this.tabPage3.Controls.Add(this.splitContainer1);
this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(748, 209);
this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "File Watch";
this.tabPage3.UseVisualStyleBackColor = true;
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(6, 22);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(29, 13);
this.label4.TabIndex = 5;
this.label4.Text = "Filter";
//
// button1
//
this.button1.Location = new System.Drawing.Point(95, 72);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(146, 23);
this.button1.TabIndex = 4;
this.button1.Text = "Add";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click_2);
//
// tbFilter
//
this.tbFilter.Location = new System.Drawing.Point(95, 19);
this.tbFilter.Name = "tbFilter";
this.tbFilter.Size = new System.Drawing.Size(146, 20);
this.tbFilter.TabIndex = 2;
//
// clbBreakpoints
//
this.clbBreakpoints.Dock = System.Windows.Forms.DockStyle.Fill;
this.clbBreakpoints.FormattingEnabled = true;
this.clbBreakpoints.Location = new System.Drawing.Point(0, 0);
this.clbBreakpoints.Name = "clbBreakpoints";
this.clbBreakpoints.Size = new System.Drawing.Size(491, 187);
this.clbBreakpoints.TabIndex = 0;
this.clbBreakpoints.ItemCheck += new System.Windows.Forms.ItemCheckEventHandler(this.clbBreakpoints_ItemCheck);
this.clbBreakpoints.KeyDown += new System.Windows.Forms.KeyEventHandler(this.clbBreakpoints_KeyDown);
//
// tabWatch
//
this.tabWatch.Controls.Add(this.splitContainer1);
this.tabWatch.Location = new System.Drawing.Point(4, 22);
this.tabWatch.Name = "tabWatch";
this.tabWatch.Padding = new System.Windows.Forms.Padding(3);
this.tabWatch.Size = new System.Drawing.Size(748, 193);
this.tabWatch.TabIndex = 2;
this.tabWatch.Text = "File Watch";
this.tabWatch.UseVisualStyleBackColor = true;
//
// splitContainer1
//
@ -313,7 +461,7 @@
// splitContainer1.Panel2
//
this.splitContainer1.Panel2.Controls.Add(this.lbOpenedFiles);
this.splitContainer1.Size = new System.Drawing.Size(742, 203);
this.splitContainer1.Size = new System.Drawing.Size(742, 187);
this.splitContainer1.SplitterDistance = 522;
this.splitContainer1.TabIndex = 3;
//
@ -328,7 +476,7 @@
this.lvFileDetails.HideSelection = false;
this.lvFileDetails.Location = new System.Drawing.Point(0, 0);
this.lvFileDetails.Name = "lvFileDetails";
this.lvFileDetails.Size = new System.Drawing.Size(522, 203);
this.lvFileDetails.Size = new System.Drawing.Size(522, 187);
this.lvFileDetails.TabIndex = 2;
this.lvFileDetails.UseCompatibleStateImageBehavior = false;
this.lvFileDetails.View = System.Windows.Forms.View.Details;
@ -354,19 +502,19 @@
this.lbOpenedFiles.FormattingEnabled = true;
this.lbOpenedFiles.Location = new System.Drawing.Point(0, 0);
this.lbOpenedFiles.Name = "lbOpenedFiles";
this.lbOpenedFiles.Size = new System.Drawing.Size(216, 203);
this.lbOpenedFiles.Size = new System.Drawing.Size(216, 187);
this.lbOpenedFiles.TabIndex = 0;
//
// tabPage5
// tabMemory
//
this.tabPage5.Controls.Add(this.splitContainer4);
this.tabPage5.Location = new System.Drawing.Point(4, 22);
this.tabPage5.Name = "tabPage5";
this.tabPage5.Padding = new System.Windows.Forms.Padding(3);
this.tabPage5.Size = new System.Drawing.Size(748, 209);
this.tabPage5.TabIndex = 4;
this.tabPage5.Text = "Memory";
this.tabPage5.UseVisualStyleBackColor = true;
this.tabMemory.Controls.Add(this.splitContainer4);
this.tabMemory.Location = new System.Drawing.Point(4, 22);
this.tabMemory.Name = "tabMemory";
this.tabMemory.Padding = new System.Windows.Forms.Padding(3);
this.tabMemory.Size = new System.Drawing.Size(748, 193);
this.tabMemory.TabIndex = 4;
this.tabMemory.Text = "Memory";
this.tabMemory.UseVisualStyleBackColor = true;
//
// splitContainer4
//
@ -376,26 +524,28 @@
//
// splitContainer4.Panel1
//
this.splitContainer4.Panel1.Controls.Add(this.textBox1);
this.splitContainer4.Panel1.Controls.Add(this.txMemoryDump);
//
// splitContainer4.Panel2
//
this.splitContainer4.Panel2.Controls.Add(this.groupBox2);
this.splitContainer4.Size = new System.Drawing.Size(742, 203);
this.splitContainer4.Size = new System.Drawing.Size(742, 187);
this.splitContainer4.SplitterDistance = 391;
this.splitContainer4.TabIndex = 7;
//
// textBox1
// txMemoryDump
//
this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBox1.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBox1.Location = new System.Drawing.Point(0, 0);
this.textBox1.Multiline = true;
this.textBox1.Name = "textBox1";
this.textBox1.ReadOnly = true;
this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.textBox1.Size = new System.Drawing.Size(391, 203);
this.textBox1.TabIndex = 0;
this.txMemoryDump.BackColor = System.Drawing.SystemColors.Window;
this.txMemoryDump.Cursor = System.Windows.Forms.Cursors.Default;
this.txMemoryDump.Dock = System.Windows.Forms.DockStyle.Fill;
this.txMemoryDump.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.txMemoryDump.Location = new System.Drawing.Point(0, 0);
this.txMemoryDump.Multiline = true;
this.txMemoryDump.Name = "txMemoryDump";
this.txMemoryDump.ReadOnly = true;
this.txMemoryDump.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
this.txMemoryDump.Size = new System.Drawing.Size(391, 187);
this.txMemoryDump.TabIndex = 0;
//
// groupBox2
//
@ -408,7 +558,7 @@
this.groupBox2.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox2.Location = new System.Drawing.Point(0, 0);
this.groupBox2.Name = "groupBox2";
this.groupBox2.Size = new System.Drawing.Size(347, 203);
this.groupBox2.Size = new System.Drawing.Size(347, 187);
this.groupBox2.TabIndex = 8;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "View or Dump Memory";
@ -466,64 +616,77 @@
this.txSize.TabIndex = 3;
this.txSize.Text = "256";
//
// statusStrip1
// tabOutput
//
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.lblStatus});
this.statusStrip1.Location = new System.Drawing.Point(0, 305);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(762, 22);
this.statusStrip1.TabIndex = 10;
this.statusStrip1.Text = "statusStrip1";
this.tabOutput.Controls.Add(this.splitContainer5);
this.tabOutput.Location = new System.Drawing.Point(4, 22);
this.tabOutput.Name = "tabOutput";
this.tabOutput.Padding = new System.Windows.Forms.Padding(3);
this.tabOutput.Size = new System.Drawing.Size(748, 193);
this.tabOutput.TabIndex = 3;
this.tabOutput.Text = "Debug Output";
this.tabOutput.UseVisualStyleBackColor = true;
//
// lblStatus
// splitContainer5
//
this.lblStatus.Name = "lblStatus";
this.lblStatus.Size = new System.Drawing.Size(39, 17);
this.lblStatus.Text = "Ready";
this.splitContainer5.Dock = System.Windows.Forms.DockStyle.Fill;
this.splitContainer5.FixedPanel = System.Windows.Forms.FixedPanel.Panel1;
this.splitContainer5.IsSplitterFixed = true;
this.splitContainer5.Location = new System.Drawing.Point(3, 3);
this.splitContainer5.Name = "splitContainer5";
this.splitContainer5.Orientation = System.Windows.Forms.Orientation.Horizontal;
//
// splitContainer5.Panel1
//
this.splitContainer5.Panel1.Controls.Add(this.txFilter);
this.splitContainer5.Panel1.Controls.Add(this.label3);
//
// splitContainer5.Panel2
//
this.splitContainer5.Panel2.Controls.Add(this.lbDebug);
this.splitContainer5.Size = new System.Drawing.Size(742, 187);
this.splitContainer5.SplitterDistance = 26;
this.splitContainer5.TabIndex = 6;
//
// txFilter
//
this.txFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txFilter.Enabled = false;
this.txFilter.Location = new System.Drawing.Point(41, 3);
this.txFilter.Name = "txFilter";
this.txFilter.Size = new System.Drawing.Size(698, 20);
this.txFilter.TabIndex = 4;
//
// label3
//
this.label3.AutoSize = true;
this.label3.Enabled = false;
this.label3.Location = new System.Drawing.Point(3, 6);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(32, 13);
this.label3.TabIndex = 5;
this.label3.Text = "Filter:";
//
// lbDebug
//
this.lbDebug.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbDebug.FormattingEnabled = true;
this.lbDebug.Location = new System.Drawing.Point(0, 0);
this.lbDebug.Name = "lbDebug";
this.lbDebug.ScrollAlwaysVisible = true;
this.lbDebug.Size = new System.Drawing.Size(742, 157);
this.lbDebug.TabIndex = 3;
//
// diagSaveMemory
//
this.diagSaveMemory.Filter = "Any Type|*.*";
//
// disassemblyText
//
this.disassemblyText.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.disassemblyText.Dock = System.Windows.Forms.DockStyle.Fill;
this.disassemblyText.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.disassemblyText.Location = new System.Drawing.Point(0, 0);
this.disassemblyText.Name = "disassemblyText";
this.disassemblyText.ReadOnly = true;
this.disassemblyText.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.ForcedVertical;
this.disassemblyText.Size = new System.Drawing.Size(550, 203);
this.disassemblyText.TabIndex = 1;
this.disassemblyText.Text = "";
//
// cbFrames
//
this.cbFrames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cbFrames.Name = "cbFrames";
this.cbFrames.Size = new System.Drawing.Size(200, 25);
this.cbFrames.SelectedIndexChanged += new System.EventHandler(this.cbFrames_SelectedIndexChanged);
//
// toolStripLabel1
//
this.toolStripLabel1.Name = "toolStripLabel1";
this.toolStripLabel1.Size = new System.Drawing.Size(47, 22);
this.toolStripLabel1.Text = "Thread:";
//
// toolStripLabel2
//
this.toolStripLabel2.Name = "toolStripLabel2";
this.toolStripLabel2.Size = new System.Drawing.Size(74, 22);
this.toolStripLabel2.Text = "Stack Frame:";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(762, 327);
this.Controls.Add(this.statusStrip1);
this.Controls.Add(this.tableLayoutPanel3);
this.Controls.Add(this.toolStrip1);
this.Name = "Form1";
@ -532,23 +695,30 @@
this.toolStrip1.ResumeLayout(false);
this.toolStrip1.PerformLayout();
this.tableLayoutPanel3.ResumeLayout(false);
this.tabControl1.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.tableLayoutPanel3.PerformLayout();
this.statusBar.ResumeLayout(false);
this.statusBar.PerformLayout();
this.tabContainer.ResumeLayout(false);
this.tabDisassembly.ResumeLayout(false);
this.splitContainer2.Panel1.ResumeLayout(false);
this.splitContainer2.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit();
this.splitContainer2.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.groupBox3.ResumeLayout(false);
this.groupBox3.PerformLayout();
this.tabBreakpoints.ResumeLayout(false);
this.splitContainer3.Panel1.ResumeLayout(false);
this.splitContainer3.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer3)).EndInit();
this.splitContainer3.ResumeLayout(false);
this.groupBox1.ResumeLayout(false);
this.groupBox1.PerformLayout();
this.tabPage3.ResumeLayout(false);
this.tabWatch.ResumeLayout(false);
this.splitContainer1.Panel1.ResumeLayout(false);
this.splitContainer1.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit();
this.splitContainer1.ResumeLayout(false);
this.tabPage5.ResumeLayout(false);
this.tabMemory.ResumeLayout(false);
this.splitContainer4.Panel1.ResumeLayout(false);
this.splitContainer4.Panel1.PerformLayout();
this.splitContainer4.Panel2.ResumeLayout(false);
@ -556,8 +726,12 @@
this.splitContainer4.ResumeLayout(false);
this.groupBox2.ResumeLayout(false);
this.groupBox2.PerformLayout();
this.statusStrip1.ResumeLayout(false);
this.statusStrip1.PerformLayout();
this.tabOutput.ResumeLayout(false);
this.splitContainer5.Panel1.ResumeLayout(false);
this.splitContainer5.Panel1.PerformLayout();
this.splitContainer5.Panel2.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.splitContainer5)).EndInit();
this.splitContainer5.ResumeLayout(false);
this.ResumeLayout(false);
this.PerformLayout();
@ -573,27 +747,26 @@
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
private System.Windows.Forms.ToolStripComboBox cbThreads;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.TabPage tabPage4;
private System.Windows.Forms.TabControl tabContainer;
private System.Windows.Forms.TabPage tabDisassembly;
private System.Windows.Forms.TabPage tabBreakpoints;
private System.Windows.Forms.TabPage tabWatch;
private System.Windows.Forms.TabPage tabOutput;
private System.Windows.Forms.ListView lvFileDetails;
private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.ColumnHeader columnHeader2;
private System.Windows.Forms.ColumnHeader columnHeader3;
private System.Windows.Forms.SplitContainer splitContainer1;
private System.Windows.Forms.ListBox lbOpenedFiles;
private System.Windows.Forms.TabPage tabPage5;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TabPage tabMemory;
private System.Windows.Forms.TextBox txMemoryDump;
private System.Windows.Forms.Button btnReadMemory;
private System.Windows.Forms.TextBox txAddress;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.TextBox tbFileBit;
private System.Windows.Forms.CheckBox checkBox1;
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.TextBox tbFilter;
private System.Windows.Forms.StatusStrip statusBar;
private System.Windows.Forms.ToolStripStatusLabel lblStatus;
private RicherTextBox disassemblyText;
private RicherTextBox txDisassembly;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox txSize;
@ -606,6 +779,19 @@
private System.Windows.Forms.ToolStripLabel toolStripLabel1;
private System.Windows.Forms.ToolStripComboBox cbFrames;
private System.Windows.Forms.ToolStripLabel toolStripLabel2;
private System.Windows.Forms.GroupBox groupBox3;
private System.Windows.Forms.Button btnDisassemble;
private System.Windows.Forms.TextBox txDisassemblyAddr;
private System.Windows.Forms.SplitContainer splitContainer5;
private System.Windows.Forms.TextBox txFilter;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.ListBox lbDebug;
private System.Windows.Forms.CheckedListBox clbBreakpoints;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.ComboBox cbAction;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.GroupBox groupBox4;
}
}

View File

@ -25,63 +25,17 @@ namespace CxbxDebugger
List<DebuggerThread> DebugThreads = new List<DebuggerThread>();
List<DebuggerModule> DebugModules = new List<DebuggerModule>();
enum FileEventType
{
Opened,
Read,
Write,
Closed,
OpenedFailed,
}
FileWatchManager fileWatchMan;
DebugOutputManager debugStrMan;
struct FileEvents
{
public FileEventType Type;
public string Name;
public uint Length;
public uint Offset;
public FileEvents(FileEventType Type, string Name, uint Length = 0, uint Offset = uint.MaxValue)
{
this.Type = Type;
this.Name = Name;
this.Length = Length;
this.Offset = Offset;
}
public static FileEvents Opened(string Name)
{
return new FileEvents(FileEventType.Opened, Name);
}
public static FileEvents OpenedFailed(string Name)
{
return new FileEvents(FileEventType.OpenedFailed, Name);
}
public static FileEvents Read(string Name, uint Length, uint Offset)
{
return new FileEvents(FileEventType.Read, Name, Length, Offset);
}
public static FileEvents Write(string Name, uint Length, uint Offset)
{
return new FileEvents(FileEventType.Write, Name, Length, Offset);
}
public static FileEvents Closed(string Name)
{
return new FileEvents(FileEventType.Closed, Name);
}
}
List<FileEvents> DbgFileEvents = new List<FileEvents>();
List<DebuggerMessages.FileOpened> FileHandles = new List<DebuggerMessages.FileOpened>();
public Form1()
{
InitializeComponent();
// TODO: Cleanup arg handling
string[] args = Environment.GetCommandLineArgs();
// Arguments are expected before the Form is created
@ -94,7 +48,6 @@ namespace CxbxDebugger
for (int i = 1; i < args.Length; ++i)
{
items.Add(args[i]);
//listBox1.Items.Add("Arg: " + args[i]);
}
CachedArgs = items.ToArray();
@ -103,18 +56,24 @@ namespace CxbxDebugger
SetDebugProcessActive(false);
// TODO: Wait for user to start this?
//StartDebugging();
txDisassembly.InlineLinkClicked += OnDisassemblyNavigation;
disassemblyText.InlineLinkClicked += OnDisassemblyNavigation;
foreach (string FileEventEnum in Enum.GetNames(typeof(FileEventType)))
{
cbAction.Items.Add(FileEventEnum);
}
cbAction.SelectedIndex = 0;
fileWatchMan = new FileWatchManager(clbBreakpoints);
debugStrMan = new DebugOutputManager(lbDebug);
}
private void OnDisassemblyNavigation(object sender, InlineLinkClickedEventArgs e)
{
// TODO: Go to memory window?
// TODO: Switch to memory region
Console.WriteLine("Attempting to view memory at " + e.Link);
ShowMemoryAt(e.Link);
ShowDisassemblyAt(e.Link);
}
private void StartDebugging()
@ -126,7 +85,7 @@ namespace CxbxDebugger
// First launch
Create = true;
}
else if (DebuggerWorkerThread.ThreadState == System.Threading.ThreadState.Stopped)
else if (DebuggerWorkerThread.ThreadState == ThreadState.Stopped)
{
// Further launches
Create = true;
@ -160,7 +119,6 @@ namespace CxbxDebugger
{
bool IsMainThread = (Thread.Handle == Thread.OwningProcess.MainThread.Handle);
bool IsFocusThread = (FocusThread != null) && (Thread.Handle == FocusThread.Handle);
string DisplayStr = "";
string PrefixStr = "";
// Threads with focus are marked differently
@ -171,17 +129,27 @@ namespace CxbxDebugger
if (IsMainThread)
PrefixStr = "> ";
if (Thread.DebugName != null)
string DisplayStr = string.Format("{0}[{1}] ", PrefixStr, (uint)Thread.Handle);
// Resolve thread name
if (IsMainThread)
{
DisplayStr = string.Format("{0}[{1}] {2}", PrefixStr, (uint)Thread.Handle, Thread.DebugName);
DisplayStr += "Main Thread";
}
else if (Thread.DebugName != null)
{
DisplayStr += Thread.DebugName;
}
else
{
string fn = Path.GetFileName(Thread.OwningProcess.Path);
DisplayStr = string.Format("{0}[{1}] {2}!{3:X8}", PrefixStr, (uint)Thread.Handle, fn, (uint)Thread.StartAddress);
DisplayStr += string.Format("{0}!{1:X8}", fn, (uint)Thread.StartAddress);
}
if( Thread.WasSuspended )
// Check if the thread is already suspended
if (Thread.WasSuspended)
{
DisplayStr += " (suspended)";
}
@ -206,6 +174,11 @@ namespace CxbxDebugger
}
}
private void OutputString(string Message)
{
debugStrMan.AddLine(Message);
}
private void DebugLog(string Message)
{
string MessageStamped = string.Format("[{0}] {1}", DateTime.Now.ToLongTimeString(), Message);
@ -224,15 +197,8 @@ namespace CxbxDebugger
}
}
private bool MatchString(string Haystack, string Needle)
{
return Haystack.Contains(Needle);
}
private void DebugFileEvent(FileEvents Event)
{
DbgFileEvents.Add(Event);
Invoke(new MethodInvoker(delegate ()
{
lvFileDetails.BeginUpdate();
@ -254,7 +220,7 @@ namespace CxbxDebugger
lvi.SubItems.Add(text);
break;
case FileEventType.OpenedFailed:
case FileEventType.FailedOpen:
lvi.SubItems.Add("Failed to open file");
break;
}
@ -266,7 +232,7 @@ namespace CxbxDebugger
case FileEventType.Opened:
case FileEventType.Closed:
case FileEventType.OpenedFailed:
case FileEventType.FailedOpen:
{
lbOpenedFiles.BeginUpdate();
lbOpenedFiles.Items.Clear();
@ -282,21 +248,12 @@ namespace CxbxDebugger
}
}));
// Very POC check for files hit
if (Event.Type == FileEventType.Opened)
// TODO: Move to breakpoint manager
if (fileWatchMan.Match(Event))
{
if (tbFileBit.Text.Length > 0)
if (DebuggerInst != null)
{
if (MatchString(Event.Name, tbFileBit.Text))
{
if( checkBox1.Checked )
{
if (DebuggerInst != null)
{
Suspend("file open");
}
}
}
Suspend("file open");
}
}
}
@ -389,7 +346,7 @@ namespace CxbxDebugger
int remainingThreads = Process.Threads.Count;
frm.DebugLog(string.Format("Process exited {0} ({1})", Process.ProcessID, PrettyExitCode(ExitCode)));
frm.DebugLog(string.Format("{0} thread(s) remain open", remainingThreads));
frm.DebugLog(string.Format("{0} child thread(s) remain open", remainingThreads));
frm.DebugModules.Clear();
@ -451,7 +408,7 @@ namespace CxbxDebugger
public void OnDebugOutput(string Message)
{
frm.DebugLog(string.Format("OutputDebugString \"{0}\"", Message));
frm.OutputString(Message);
}
public bool OnAccessViolation(DebuggerThread Thread, uint Code, IntPtr Address)
@ -459,11 +416,11 @@ namespace CxbxDebugger
string ProcessName = "??";
var Module = frm.DebuggerInst.ResolveModule((uint)Address);
if( Module != null )
if (Module != null)
{
ProcessName = Path.GetFileName(Module.Path);
}
// TODO Include GetLastError string
string ExceptionMessage = string.Format("Access violation thrown at 0x{0:X8} ({1})", (uint)Address, ProcessName);
@ -546,6 +503,10 @@ namespace CxbxDebugger
}
lblStatus.Text = string.Format("Suspended ({0})", Reason);
cbThreads.Enabled = true;
cbFrames.Enabled = true;
}
private void Resume()
@ -556,6 +517,9 @@ namespace CxbxDebugger
}
lblStatus.Text = "Running";
cbThreads.Enabled = false;
cbFrames.Enabled = false;
}
private void toolStripButton2_Click(object sender, EventArgs e)
@ -567,12 +531,14 @@ namespace CxbxDebugger
{
Resume();
}
private Bitmap DumpFramebuffer()
{
// NOTE: This does not work yet
IntPtr BufferAddr = DebuggerInst.GetScreenBuffer();
uint BufferSize = 640 * 480 * 4;
var buff = DebugThreads[0].OwningProcess.ReadMemoryBlock(BufferAddr, BufferSize);
// todo: convert this buffer into (RGBA from BGRA)
@ -587,12 +553,19 @@ namespace CxbxDebugger
return bmp;
}
List<IntPtr> CallstackAddress = new List<IntPtr>();
private void btnDumpCallstack_Click(object sender, EventArgs e)
struct CallstackInfo
{
public uint InstructionPointer;
public uint ModuleBase;
}
public CallstackInfo(uint IP, uint Base)
{
InstructionPointer = IP;
ModuleBase = Base;
}
};
List<CallstackInfo> CallstackDump = new List<CallstackInfo>();
static private bool ReadInt(TextBox Source, ref int Out)
{
@ -636,9 +609,10 @@ namespace CxbxDebugger
if (size < 0)
size = 256;
// Pick any thread to find the owner process
return DebugThreads[0].OwningProcess.ReadMemoryBlock(new IntPtr(addr), (uint)size);
}
private void button1_Click(object sender, EventArgs e)
{
if (DebuggerInst == null)
@ -660,85 +634,117 @@ namespace CxbxDebugger
hexData += "\r\n";
}
textBox1.Text = hexData;
txMemoryDump.Text = hexData;
}
private void button2_Click(object sender, EventArgs e)
{
// TODO Fix the frame buffer lookup
// TODO Investigate querying the D3D backbuffer surface
//pictureBox1.Image = DumpFramebuffer();
}
public delegate void OtherData(string Part);
public delegate void ResolveAddressSymbol(uint Address);
public delegate void DisResultOther(string Part);
public delegate void DisResultAddress(uint Address);
public static void ExtractSymbols(string Text, OtherData Data, ResolveAddressSymbol Resolver)
public static void ExtractSymbols(string Text, DisResultOther ProcessOtherData, DisResultAddress ProcessAddrData)
{
// This regex will match addresses in the format "0x123"
// TODO: Fix ajoined addresses ie "0x1230x123" - treated as 0x1230
MatchCollection Matches = Regex.Matches(Text, "(0x[a-f0-9]+)", RegexOptions.IgnoreCase);
int LastIndex = 0;
for(int i = 0; i < Matches.Count; ++i)
for (int i = 0; i < Matches.Count; ++i)
{
if( Matches[i].Index > LastIndex )
if (Matches[i].Index > LastIndex)
{
var Last = Text.Substring(LastIndex, Matches[i].Index - LastIndex);
Data(Last);
ProcessOtherData(Last);
}
uint Address = (uint)Convert.ToInt32(Matches[i].ToString(), 16);
Resolver(Address);
ProcessAddrData(Address);
LastIndex = Matches[i].Index + Matches[i].Length;
}
if( LastIndex < Text.Length)
if (LastIndex < Text.Length)
{
Data(Text.Substring(LastIndex));
ProcessOtherData(Text.Substring(LastIndex));
}
}
private void DumpDisassembly(CallstackInfo info)
{
// Read preceeding bytes for more context
// TODO: This MUST align with a previous instruction or our disassembler will fail
uint OffsetAddr = info.InstructionPointer; // -16
byte[] data = DebugThreads[0].OwningProcess.ReadMemoryBlock(new IntPtr(OffsetAddr), 64);
txDisassembly.Clear();
// TODO: Needs refactoring
// TODO: "call dword ptr [0x00XXXXXX]" instructions should be resolved
using (Capstone cs = Capstone.CreateEngine())
{
cs.DisassembleIt(data, OffsetAddr, delegate (CapstoneInstruction Instruction)
{
string Cursor = (Instruction.Address == info.InstructionPointer) ? "> " : " ";
txDisassembly.Add(Cursor);
txDisassembly.InsertLink(string.Format("{0:x8}", Instruction.Address));
txDisassembly.Add(" ");
ExtractSymbols
(
Instruction.Disassembly,
delegate (string RegData)
{
txDisassembly.Add(RegData);
},
delegate (uint address)
{
string label = Convert.ToString(address, 16);
// Temporary until we can resolve good symbols
txDisassembly.InsertLink(label);
//var symbol = DebuggerInst.ResolveSymbol(address);
//if (symbol != null)
//{
// uint offset = (address - symbol.AddrBegin);
// uint mbase = info.ModuleBase;
//
// // Add symbol name
// disassemblyText.InsertLink(string.Format("{0} +0x{1}", symbol.Name, offset), label);
//
// //txDisassembly.InsertLink(string.Format("{0}@{1:X8} ({2:X8}/{3:X8})", symbol.Name, symbol.AddrBegin, address, mbase), label);
//}
//else
//{
// txDisassembly.InsertLink(label);
//}
});
txDisassembly.AddLine("");
});
}
txDisassembly.Select(0, 0);
}
private void cbFrames_SelectedIndexChanged(object sender, EventArgs e)
{
if(cbFrames.SelectedIndex != -1 )
if (cbFrames.SelectedIndex != -1)
{
IntPtr ptr = CallstackAddress[cbFrames.SelectedIndex];
CallstackInfo info = CallstackDump[cbFrames.SelectedIndex];
if (ptr == IntPtr.Zero)
if (info.InstructionPointer == 0)
return;
// Read preceeding bytes for more context
IntPtr OffsetAddr = new IntPtr((uint)ptr - 16);
byte[] data = DebugThreads[0].OwningProcess.ReadMemoryBlock(OffsetAddr, 64);
disassemblyText.Clear();
using (Capstone cs = Capstone.CreateEngine())
{
cs.DisassembleIt(data, (ulong)OffsetAddr, delegate (CapstoneInstruction Instruction)
{
string Cursor = (Instruction.Address == (uint)ptr) ? "> " : " ";
disassemblyText.Add(string.Format("{0}{1:x8} ", Cursor, Instruction.Address));
ExtractSymbols(Instruction.Disassembly,
delegate (string Data)
{
disassemblyText.Add(Data);
},
delegate (uint Address)
{
// TODO Resolve symbol name
string label = Convert.ToString(Address, 16);
disassemblyText.InsertLink(label);
});
disassemblyText.AddLine("");
});
}
DumpDisassembly(info);
}
}
@ -747,7 +753,7 @@ namespace CxbxDebugger
if (DebuggerInst == null)
return;
if(diagSaveMemory.ShowDialog() == DialogResult.OK)
if (diagSaveMemory.ShowDialog() == DialogResult.OK)
{
byte[] data = ReadMemory();
if (data == null)
@ -761,13 +767,13 @@ namespace CxbxDebugger
}
}
private void DumpCallstack()
private void DumpCallstack(bool ShowExternal = false)
{
int Index = cbThreads.SelectedIndex;
if (Index == -1)
return;
CallstackAddress.Clear();
CallstackDump.Clear();
cbFrames.Items.Clear();
int OtherModuleCount = 0;
@ -780,10 +786,13 @@ namespace CxbxDebugger
var Module = DebuggerInst.ResolveModule((uint)StackFrame.PC);
if (Module != null)
{
if (!Module.Core)
if (!ShowExternal)
{
OtherModuleCount++;
continue;
if (!Module.Core)
{
OtherModuleCount++;
continue;
}
}
ModuleName = Path.GetFileName(Module.Path);
@ -791,29 +800,39 @@ namespace CxbxDebugger
}
else
{
OtherModuleCount++;
if (!ShowExternal)
{
OtherModuleCount++;
}
continue;
}
if (OtherModuleCount > 0)
if (!ShowExternal)
{
CallstackAddress.Add(IntPtr.Zero);
cbFrames.Items.Add("[External Code]");
OtherModuleCount = 0;
if (OtherModuleCount > 0)
{
CallstackDump.Add(new CallstackInfo());
cbFrames.Items.Add("[External Code]");
OtherModuleCount = 0;
}
}
uint ModuleOffset = (uint)StackFrame.PC - ModuleBase;
string FrameString = string.Format("{0} +{1:X8} ({2:X8})", ModuleName, ModuleOffset, (uint)StackFrame.PC);
CallstackAddress.Add(StackFrame.PC);
// To program counter
CallstackDump.Add(new CallstackInfo((uint)StackFrame.PC, ModuleBase));
cbFrames.Items.Add(FrameString);
}
if (OtherModuleCount > 0)
if (!ShowExternal)
{
CallstackAddress.Add(IntPtr.Zero);
cbFrames.Items.Add("[External Code]");
OtherModuleCount = 0;
if (OtherModuleCount > 0)
{
CallstackDump.Add(new CallstackInfo());
cbFrames.Items.Add("[External Code]");
OtherModuleCount = 0;
}
}
}
@ -825,10 +844,53 @@ namespace CxbxDebugger
private void ShowMemoryAt(string Address)
{
// Switch to memory page and set address string
tabControl1.SelectedTab = tabPage5;
tabContainer.SelectedTab = tabMemory;
txAddress.Text = string.Format("0x{0}", Address);
}
private void ShowDisassemblyAt(string Address)
{
tabContainer.SelectedTab = tabDisassembly;
txDisassemblyAddr.Text = string.Format("0x{0}", Address);
uint addr = 0;
if (ReadAddress(txDisassemblyAddr, ref addr))
{
// TODO: Which module are we dumping
DumpDisassembly(new CallstackInfo(addr, 0));
}
}
private void button1_Click_1(object sender, EventArgs e)
{
uint addr = 0;
if (ReadAddress(txDisassemblyAddr, ref addr))
{
// TODO: Which module are we dumping
DumpDisassembly(new CallstackInfo(addr, 0));
}
}
private void button1_Click_2(object sender, EventArgs e)
{
FileEventType Event = (FileEventType)cbAction.SelectedIndex;
fileWatchMan.Add(Event, tbFilter.Text);
}
private void clbBreakpoints_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Delete)
{
if (clbBreakpoints.SelectedIndex != -1)
{
fileWatchMan.Delete(clbBreakpoints.SelectedIndex);
}
}
}
private void clbBreakpoints_ItemCheck(object sender, ItemCheckEventArgs e)
{
fileWatchMan.SetEnabled(e.Index, e.NewValue == CheckState.Checked);
}
}
}

View File

@ -117,13 +117,136 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="lbConsole.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="toolStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<metadata name="toolStrip1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tableLayoutPanel3.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="statusBar.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>122, 17</value>
</metadata>
<metadata name="statusBar.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tabContainer.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tabDisassembly.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="splitContainer2.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="txDisassembly.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="groupBox3.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnDisassemble.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="txDisassemblyAddr.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tabBreakpoints.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="splitContainer3.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="groupBox4.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="groupBox1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="cbAction.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="label5.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="label4.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="button1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tbFilter.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="clbBreakpoints.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tabWatch.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="splitContainer1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="lvFileDetails.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="lbOpenedFiles.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tabMemory.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="splitContainer4.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="txMemoryDump.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="groupBox2.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="label1.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnDumpMemory.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="txAddress.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="label2.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="btnReadMemory.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="txSize.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="tabOutput.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="splitContainer5.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="txFilter.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="label3.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="lbDebug.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="diagSaveMemory.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>238, 17</value>
</metadata>
<metadata name="$this.Locked" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
</root>

View File

@ -123,7 +123,7 @@ namespace CxbxDebugger
{
if (InlineLinkClicked != null)
{
int Split = e.LinkText.IndexOf('@');
int Split = e.LinkText.LastIndexOf('@');
string Label = e.LinkText.Substring(0, Split);
string Link = e.LinkText.Substring(Split + 1);