Minor encapsulation
This commit is contained in:
parent
7768bfc784
commit
fd6625f584
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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>
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue