/[RomCheater]/trunk/RomCheater/Docking/FloatingRamDumperDialog.cs
ViewVC logotype

Diff of /trunk/RomCheater/Docking/FloatingRamDumperDialog.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

--- trunk/RomCheater/Docking/FloatingRamDumperDialog.cs	2012/05/27 23:33:54	148
+++ trunk/RomCheater/Docking/FloatingRamDumperDialog.cs	2012/05/28 04:14:03	156
@@ -7,20 +7,166 @@
 using System.Text;
 using System.Windows.Forms;
 using WeifenLuo.WinFormsUI.Docking;
+using RomCheater.PluginFramework.Interfaces;
+using System.Diagnostics;
 
 namespace RomCheater.Docking
 {
-    public partial class FloatingRamDumperDialog : DockContent
+    public partial class FloatingRamDumperDialog : DockContent, IProcessConfig
     {
-        public FloatingRamDumperDialog()
+        #region sub-classes
+        private const int BYTE_CORRECTION_VALUE = 23;
+        public enum DumpSize
         {
-            InitializeComponent();
+            Bytes,
+            KiloBytes,
+            MegaBytes,
+            GigaBytes,
         }
+        #endregion
+        private DumpSize dumpSize = DumpSize.Bytes;
 
+        public FloatingRamDumperDialog() { InitializeComponent(); this.AcceptedPlugin = null; this.AcceptedProcess = null; }
+        public FloatingRamDumperDialog(IConfigPlugin config) : this() { this.AcceptedPlugin = config; }
+        public FloatingRamDumperDialog(IConfigPlugin config, Process process) : this() { this.AcceptedPlugin = config; this.AcceptedProcess = process; }
+       
         private void FloatingRamDumperDialog_Load(object sender, EventArgs e)
         {
             txtStart.Value = 0;
             txtEnd.Value = int.MaxValue;
         }
+
+
+        #region IProcessConfig Members'
+        public Process AcceptedProcess { get; set; }
+        #endregion
+        #region IAcceptsPlugin<IConfigPlugin> Members
+        public IConfigPlugin AcceptedPlugin { get; set; }
+        #endregion
+
+        private void radioBTNBytes_CheckedChanged(object sender, EventArgs e)
+        {
+            dumpSize = DumpSize.Bytes;
+        }
+
+        private void radioBTNKiloBytes_CheckedChanged(object sender, EventArgs e)
+        {
+            dumpSize = DumpSize.KiloBytes;
+        }
+
+        private void radioBTNMegaBytes_CheckedChanged(object sender, EventArgs e)
+        {
+            dumpSize = DumpSize.MegaBytes;
+        }
+
+        private void radioBTNGigaBytes_CheckedChanged(object sender, EventArgs e)
+        {
+            dumpSize = DumpSize.GigaBytes;
+        }
+
+        private void btnCalcEndAddr_Click(object sender, EventArgs e)
+        {
+            ulong start = 0;
+            ulong end = 0;
+            start = txtStart.Value;
+            switch (dumpSize)
+            {
+                case DumpSize.Bytes:
+                    end = (ulong)(Convert.ToDouble(txtDumpSize.Text) * 1.0 + start) - BYTE_CORRECTION_VALUE;
+                    txtEnd.Value = end;
+                    break;
+                case DumpSize.KiloBytes:
+                    end = (ulong)(Convert.ToDouble(txtDumpSize.Text) * 1000.0 + start) - BYTE_CORRECTION_VALUE;
+                    txtEnd.Value = end;
+                    break;
+                case DumpSize.MegaBytes:
+                    end = (ulong)(Convert.ToDouble(txtDumpSize.Text) * 1000000.0 + start) - BYTE_CORRECTION_VALUE;
+                    txtEnd.Value = end;
+                    break;
+                case DumpSize.GigaBytes:
+                    end = (ulong)(Convert.ToDouble(txtDumpSize.Text) * 1000000000.0 + start) - BYTE_CORRECTION_VALUE;
+                    txtEnd.Value = end;
+                    break;
+            }
+        }
+
+        private void btnCalcStartAddr_Click(object sender, EventArgs e)
+        {
+            long start = 0;
+            long end = 0;
+            end = txtEnd.ToInt64();
+            switch (dumpSize)
+            {
+                case DumpSize.Bytes:
+                    start = (long)((double)end - (Convert.ToDouble(txtDumpSize.Text) * 1.0)) + BYTE_CORRECTION_VALUE;
+                    txtStart.Value = (ulong)start;;
+                    break;
+                case DumpSize.KiloBytes:
+                    start = (long)((double)end - (Convert.ToDouble(txtDumpSize.Text) * 1000.0)) + BYTE_CORRECTION_VALUE;
+                    txtStart.Value = (ulong)start;;
+                    break;
+                case DumpSize.MegaBytes:
+                    start = (long)((double)end - (Convert.ToDouble(txtDumpSize.Text) * 1000000.0)) + BYTE_CORRECTION_VALUE;
+                    txtStart.Value = (ulong)start;;
+                    break;
+                case DumpSize.GigaBytes:
+                    start = (long)((double)end - (Convert.ToDouble(txtDumpSize.Text) * 1000000000.0)) + BYTE_CORRECTION_VALUE;
+                    txtStart.Value = (ulong)start;
+                    break;
+            }
+        }
+
+        private void btnCalcDumpSize_Click(object sender, EventArgs e)
+        {
+            ulong start = txtStart.Value;
+            ulong end = txtEnd.Value;
+            ulong byte_diff = (end - start) + BYTE_CORRECTION_VALUE;
+            switch (dumpSize)
+            {
+                case DumpSize.Bytes:
+                    txtDumpSize.Text = string.Format("{0:n2}", (double)byte_diff);
+                    break;
+                case DumpSize.KiloBytes:
+                    txtDumpSize.Text = string.Format("{0:n3}", (double)byte_diff / 1000.0);
+                    break;
+                case DumpSize.MegaBytes:
+                    txtDumpSize.Text = string.Format("{0:n6}", (double)byte_diff / 1000000.0);
+                    break;
+                case DumpSize.GigaBytes:
+                    txtDumpSize.Text = string.Format("{0:n9}", (double)byte_diff / 1000000000.0);
+                    break;
+            }
+        }
+
+        private void btnDumpRam_Click(object sender, EventArgs e)
+        {
+            if (this.AcceptedProcess == null)
+            {
+                MessageBox.Show("Please select a process to dump memory from", "", MessageBoxButtons.OK, MessageBoxIcon.Error);
+                return;
+            }
+            DialogResult result = dumpsaver.ShowDialog();
+            if (result != DialogResult.OK) return;
+            DumpRam(txtStart.Value, txtEnd.Value, dumpsaver.FileName);
+        }
+
+
+        #region memory support
+        private void DumpRam(ulong start, ulong end, string filename)
+        {
+            uint byte_count = (uint)(end - start);
+            DumpRam(start, byte_count, filename);
+        }
+        private void DumpRam(ulong start, uint count, string filename)
+        {
+            if (this.AcceptedProcess == null) return;
+            Sojaner.MemoryScanner.ProcessMemoryReader reader = new Sojaner.MemoryScanner.ProcessMemoryReader();
+            reader.ReadProcess = this.AcceptedProcess;
+            reader.OpenProcess();
+            int bytesReadSize;
+            byte[] data = reader.ReadProcessMemory((IntPtr)(uint)start, count, out bytesReadSize);
+            reader.CloseHandle();
+        }
+        #endregion
     }
 }

 

  ViewVC Help
Powered by ViewVC 1.1.22