--- trunk/RomCheater/Docking/UI/UIMemoryViewer.cs 2012/06/02 10:43:05 214 +++ trunk/RomCheater/Docking/UI/UIMemoryViewer.cs 2012/06/03 15:15:51 246 @@ -1,4 +1,6 @@ -using System; +#define DISABLE_GETFIRSTNONZEROBYTE_ONUPDATE_ACCEPTEDPROCESS // when defined will not call GetFirstNonZeroByte() when AcceptedProcess is updated and is not null +#define DISABLE_GETFIRSTNONZERO_BYTE // when defined will make GetFirstNonZeroByte() an empty void method +using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; @@ -10,10 +12,14 @@ using RomCheater.Logging; using RomCheater.PluginFramework.Interfaces; using System.Diagnostics; +using Sojaner.MemoryScanner.MemoryProviers; namespace RomCheater.Docking.UI { - public partial class UIMemoryViewer : UserControl, IProcessConfig, IAcceptsPlugin//, IAcceptsMemoryRange + public partial class UIMemoryViewer : UserControl, + IAcceptsPlugin, + IAcceptsProcess, + IAcceptsProcessAndConfig { public UIMemoryViewer() { @@ -47,18 +53,20 @@ private void GetFirstNonZeroByte() { +#if !DISABLE_GETFIRSTNONZERO_BYTE if (!DesignMode) { - Sojaner.MemoryScanner.ProcessMemoryReader reader = new Sojaner.MemoryScanner.ProcessMemoryReader(); - reader.ReadProcess = this.AcceptedProcess; - reader.OpenProcess(); + GenericMemoryProvider provider = new GenericMemoryProvider((IAcceptsProcessAndConfig)this); + provider.OpenProvider(); uint addr = 0; - reader.ReadFirstNonZeroByte(MemoryStart, MemorySize, out addr); + provider.ReadFirstNonZeroByte(MemoryStart, MemorySize, out addr); + provider.CloseProvider(); GotoAddress(addr); } +#endif } - #region IProcessConfig Members + #region IAcceptsProcess Members private Process _AcceptedProcess; public Process AcceptedProcess { @@ -68,8 +76,10 @@ _AcceptedProcess = value; update_timer.Enabled = (value != null); UpdateEnabled = update_timer.Enabled; +#if !DISABLE_GETFIRSTNONZEROBYTE_ONUPDATE_ACCEPTEDPROCESS if (value != null) GetFirstNonZeroByte(); +#endif } } #endregion @@ -120,7 +130,7 @@ uint CURRENT_TOP_ADDR { get { return _CURRENT_TOP_ADDR; } - set { _CURRENT_TOP_ADDR = value; } + set { txthexGoto.Value = _CURRENT_TOP_ADDR = value; } } //uint CURRENT_BOITTOM_ADDR() { return CURRENT_TOP_ADDR + max_ram_view; } private void UpdateMaxRamView() @@ -188,23 +198,29 @@ } private byte[] GetMemory() { + byte[] data = new byte[] { }; try { - Sojaner.MemoryScanner.ProcessMemoryReader reader = new Sojaner.MemoryScanner.ProcessMemoryReader(); - reader.ReadProcess = this.AcceptedProcess; - reader.OpenProcess(); + GenericMemoryProvider provider = new GenericMemoryProvider((IAcceptsProcessAndConfig)this); + provider.OpenProvider(); int bytesReadSize; - byte[] data = reader.ReadProcessMemory(CURRENT_TOP_ADDR, max_ram_view, out bytesReadSize); - //this.Logger.LogDebugMessage(string.Format("GetMemory() -> Memory Size: {0}0x{2:X8}{1}", "{", "}", data.Length)); - return data; + provider.ReadProcessMemory(CURRENT_TOP_ADDR, max_ram_view, out bytesReadSize, out data); + provider.CloseProvider(); + } catch (Exception ex) { logger.Error.WriteLine("{0}.GetMemory():{1}{2}", this.GetType().Name, System.Environment.NewLine, ex.ToString()); - byte[] data = new byte[max_ram_view]; - for (int i = 0; i < data.Length; i++) { data[i] = 0x0; } - return data; } + finally + { + if (data.Length == 0) + { + data = new byte[max_ram_view]; + for (int i = 0; i < data.Length; i++) { data[i] = 0x0; } + } + } + return data; } private void UpdateMemroyView() { this.UpdateMemroyView(this.CURRENT_TOP_ADDR); } private void UpdateMemroyView(uint address) @@ -280,19 +296,17 @@ if (AcceptedPlugin == null) { return; } // Byte changed //byte[] data = (txtData.ByteProvider as DynamicByteProvider).Bytes.ToArray(); - - - Sojaner.MemoryScanner.ProcessMemoryReader reader = new Sojaner.MemoryScanner.ProcessMemoryReader(); - reader.ReadProcess = this.AcceptedProcess; - reader.OpenProcess(); + GenericMemoryProvider provider = new GenericMemoryProvider((IAcceptsProcessAndConfig)this); + provider.OpenProvider(); int bytesReadSize; for (int i = 0; i < data.Length; i ++) { uint addr = (uint)(start_address + i); byte data_to_write = data[i]; - reader.WriteProcessMemory((UIntPtr)addr, data_to_write, out bytesReadSize); + provider.WriteProcessMemory(addr, data_to_write, out bytesReadSize); } + provider.CloseProvider(); } catch (Exception ex) { logger.Error.WriteLine("{0}.WriteCurrentBytes():{1}{2}", this.GetType().Name, System.Environment.NewLine, ex.ToString()); } }