diff --git a/.gitmodules b/.gitmodules index b92a6e010..24881678b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "import/subhook"] path = import/subhook url = https://github.com/Zeex/subhook +[submodule "import/cs_x86"] + path = import/cs_x86 + url = https://github.com/x1nixmzeng/cs_x86 diff --git a/build/win32/Cxbx.sln b/build/win32/Cxbx.sln index 130f5f07e..e6cbf0fc5 100644 --- a/build/win32/Cxbx.sln +++ b/build/win32/Cxbx.sln @@ -1,13 +1,25 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26430.6 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Cxbx", "Cxbx.vcxproj", "{E7A72D3D-5810-4078-A243-348B59726365}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "subhook", "subhook.vcxproj", "{CD2DDE93-B45E-4D11-876D-D0056C3DD407}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CxbxDebugger", "..\..\src\CxbxDebugger\CxbxDebugger.csproj", "{4A68E962-3805-4376-99D3-0AC59E9BEE69}" + ProjectSection(ProjectDependencies) = postProject + {9131B025-5019-4DEE-84A3-86D2703A81C0} = {9131B025-5019-4DEE-84A3-86D2703A81C0} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cs_x86", "..\..\import\cs_x86\cs_x86\cs_x86.csproj", "{9131B025-5019-4DEE-84A3-86D2703A81C0}" + ProjectSection(ProjectDependencies) = postProject + {2171C0E8-4915-49B9-AC23-A484FA08C126} = {2171C0E8-4915-49B9-AC23-A484FA08C126} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "capstone_dll_2015", "..\..\import\cs_x86\capstone_2015\capstone_dll_2015.vcxproj", "{2171C0E8-4915-49B9-AC23-A484FA08C126}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debugger", "Debugger", "{174CB14E-34E3-422F-9A99-DBE88FF0EFBB}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -49,8 +61,35 @@ Global {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Release|Win32.Build.0 = Release|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Release|x64.ActiveCfg = Release|Any CPU {4A68E962-3805-4376-99D3-0AC59E9BEE69}.Release|x64.Build.0 = Release|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Win32.ActiveCfg = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|Win32.Build.0 = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|x64.ActiveCfg = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Debug|x64.Build.0 = Debug|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|Any CPU.Build.0 = Release|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|Win32.ActiveCfg = Release|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|Win32.Build.0 = Release|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|x64.ActiveCfg = Release|Any CPU + {9131B025-5019-4DEE-84A3-86D2703A81C0}.Release|x64.Build.0 = Release|Any CPU + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.ActiveCfg = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|Win32.Build.0 = Debug|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|x64.ActiveCfg = Debug|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Debug|x64.Build.0 = Debug|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Any CPU.ActiveCfg = Release|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Win32.ActiveCfg = Release|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|Win32.Build.0 = Release|Win32 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.ActiveCfg = Release|x64 + {2171C0E8-4915-49B9-AC23-A484FA08C126}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {4A68E962-3805-4376-99D3-0AC59E9BEE69} = {174CB14E-34E3-422F-9A99-DBE88FF0EFBB} + {9131B025-5019-4DEE-84A3-86D2703A81C0} = {174CB14E-34E3-422F-9A99-DBE88FF0EFBB} + {2171C0E8-4915-49B9-AC23-A484FA08C126} = {174CB14E-34E3-422F-9A99-DBE88FF0EFBB} + EndGlobalSection EndGlobal diff --git a/import/cs_x86 b/import/cs_x86 new file mode 160000 index 000000000..e219bde89 --- /dev/null +++ b/import/cs_x86 @@ -0,0 +1 @@ +Subproject commit e219bde89794b26cd09e116921bc6e9e5a157089 diff --git a/src/CxbxDebugger/CxbxDebugger.csproj b/src/CxbxDebugger/CxbxDebugger.csproj index f47d90086..1f3921341 100644 --- a/src/CxbxDebugger/CxbxDebugger.csproj +++ b/src/CxbxDebugger/CxbxDebugger.csproj @@ -49,6 +49,10 @@ 4 + + False + ..\..\build\win32\Debug\cs_x86.dll + diff --git a/src/CxbxDebugger/Form1.Designer.cs b/src/CxbxDebugger/Form1.Designer.cs index 45ef7ae34..40bc920cd 100644 --- a/src/CxbxDebugger/Form1.Designer.cs +++ b/src/CxbxDebugger/Form1.Designer.cs @@ -39,7 +39,9 @@ this.btnDumpCallstack = new System.Windows.Forms.ToolStripButton(); 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.textBox3 = new System.Windows.Forms.TextBox(); this.lbCallstack = new System.Windows.Forms.ListBox(); this.tabPage2 = new System.Windows.Forms.TabPage(); this.groupBox1 = new System.Windows.Forms.GroupBox(); @@ -52,14 +54,12 @@ 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.tabPage4 = new System.Windows.Forms.TabPage(); this.tabPage5 = new System.Windows.Forms.TabPage(); this.button1 = new System.Windows.Forms.Button(); this.textBox2 = new System.Windows.Forms.TextBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.statusStrip1 = new System.Windows.Forms.StatusStrip(); this.lblStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.textBox3 = new System.Windows.Forms.TextBox(); this.toolStrip1.SuspendLayout(); this.tableLayoutPanel3.SuspendLayout(); this.tabControl1.SuspendLayout(); @@ -183,7 +183,16 @@ this.tabControl1.SelectedIndex = 0; this.tabControl1.Size = new System.Drawing.Size(756, 235); this.tabControl1.TabIndex = 3; - this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged); + // + // tabPage4 + // + 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; // // tabPage1 // @@ -197,6 +206,17 @@ this.tabPage1.Text = "Disassembly"; this.tabPage1.UseVisualStyleBackColor = true; // + // textBox3 + // + this.textBox3.Font = new System.Drawing.Font("Lucida Console", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.textBox3.Location = new System.Drawing.Point(218, 6); + this.textBox3.Multiline = true; + this.textBox3.Name = "textBox3"; + this.textBox3.ReadOnly = true; + this.textBox3.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox3.Size = new System.Drawing.Size(524, 197); + this.textBox3.TabIndex = 1; + // // lbCallstack // this.lbCallstack.FormattingEnabled = true; @@ -204,6 +224,7 @@ this.lbCallstack.Name = "lbCallstack"; this.lbCallstack.Size = new System.Drawing.Size(209, 186); this.lbCallstack.TabIndex = 0; + this.lbCallstack.SelectedIndexChanged += new System.EventHandler(this.lbCallstack_SelectedIndexChanged); // // tabPage2 // @@ -314,16 +335,6 @@ this.lbOpenedFiles.Size = new System.Drawing.Size(216, 203); this.lbOpenedFiles.TabIndex = 0; // - // tabPage4 - // - 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; - // // tabPage5 // this.tabPage5.Controls.Add(this.button1); @@ -339,30 +350,30 @@ // // button1 // - this.button1.Location = new System.Drawing.Point(400, 7); + this.button1.Location = new System.Drawing.Point(593, 6); this.button1.Name = "button1"; - this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.Size = new System.Drawing.Size(149, 23); this.button1.TabIndex = 2; - this.button1.Text = "Read"; + this.button1.Text = "Read Memory"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // textBox2 // - this.textBox2.Location = new System.Drawing.Point(278, 9); + this.textBox2.Location = new System.Drawing.Point(471, 8); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(116, 20); this.textBox2.TabIndex = 1; // // textBox1 // - this.textBox1.Font = new System.Drawing.Font("Lucida Console", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + 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(6, 6); 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(266, 197); + this.textBox1.Size = new System.Drawing.Size(459, 197); this.textBox1.TabIndex = 0; // // statusStrip1 @@ -381,17 +392,6 @@ this.lblStatus.Size = new System.Drawing.Size(39, 17); this.lblStatus.Text = "Ready"; // - // textBox3 - // - this.textBox3.Font = new System.Drawing.Font("Lucida Console", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.textBox3.Location = new System.Drawing.Point(218, 6); - this.textBox3.Multiline = true; - this.textBox3.Name = "textBox3"; - this.textBox3.ReadOnly = true; - this.textBox3.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBox3.Size = new System.Drawing.Size(524, 197); - this.textBox3.TabIndex = 1; - // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); diff --git a/src/CxbxDebugger/Form1.cs b/src/CxbxDebugger/Form1.cs index 847615d6d..c1c46d9e6 100644 --- a/src/CxbxDebugger/Form1.cs +++ b/src/CxbxDebugger/Form1.cs @@ -9,6 +9,7 @@ using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServices; +using cs_x86; namespace CxbxDebugger { @@ -363,6 +364,7 @@ namespace CxbxDebugger frm.DebugModules.Add(Process); } + public void OnProcessExit(DebuggerProcess Process, uint ExitCode) { int remainingThreads = Process.Threads.Count; @@ -561,12 +563,15 @@ namespace CxbxDebugger return bmp; } + List CallstackAddress = new List(); + private void btnDumpCallstack_Click(object sender, EventArgs e) { int Index = cbThreads.SelectedIndex; if (Index == -1) return; + CallstackAddress.Clear(); lbCallstack.Items.Clear(); int OtherModuleCount = 0; @@ -596,6 +601,7 @@ namespace CxbxDebugger if (OtherModuleCount > 0) { + CallstackAddress.Add(IntPtr.Zero); lbCallstack.Items.Add("[External Code]"); OtherModuleCount = 0; } @@ -603,21 +609,18 @@ namespace CxbxDebugger uint ModuleOffset = (uint)StackFrame.PC - ModuleBase; string FrameString = string.Format("{0} +{1:X8} ({2:X8})", ModuleName, ModuleOffset, (uint)StackFrame.PC); + CallstackAddress.Add(StackFrame.PC); lbCallstack.Items.Add(FrameString); } if (OtherModuleCount > 0) { + CallstackAddress.Add(IntPtr.Zero); lbCallstack.Items.Add("[External Code]"); OtherModuleCount = 0; } } - private void tabControl1_SelectedIndexChanged(object sender, EventArgs e) - { - - } - private void button1_Click(object sender, EventArgs e) { uint addr = 0; @@ -655,5 +658,30 @@ namespace CxbxDebugger // TODO Fix the frame buffer lookup //pictureBox1.Image = DumpFramebuffer(); } + + private void lbCallstack_SelectedIndexChanged(object sender, EventArgs e) + { + if( lbCallstack.SelectedIndex != -1 ) + { + IntPtr ptr = CallstackAddress[lbCallstack.SelectedIndex]; + + if (ptr == IntPtr.Zero) + return; + + byte[] data = DebugThreads[0].OwningProcess.ReadMemoryBlock(ptr, 32); + + string disassembly = ""; + + using (Capstone cs = Capstone.CreateEngine()) + { + cs.DisassembleIt(data, (ulong)ptr, delegate (CapstoneInstruction Instruction) + { + disassembly += string.Format("{0:x8} {1}", Instruction.Address, Instruction.Disassembly) + "\r\n"; + }); + } + + textBox1.Text = disassembly; + } + } } }