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

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

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

revision 382 by william, Tue Jun 19 09:30:48 2012 UTC revision 384 by william, Tue Jun 19 10:15:53 2012 UTC
# Line 994  namespace RomCheater.Docking Line 994  namespace RomCheater.Docking
994              e.Result = st;              e.Result = st;
995              //List<ResultType<object>> tmp_Results = new List<ResultType<object>>();              //List<ResultType<object>> tmp_Results = new List<ResultType<object>>();
996              List<ResultType<object>> second_tmp_Results = new List<ResultType<object>>();              List<ResultType<object>> second_tmp_Results = new List<ResultType<object>>();
997              const double _UPDATE_DELAY = 10240.0;              const int ElementsBeforeDisplay = 100;
998              int UPDATE_DELAY = (int)(_UPDATE_DELAY / 1000);              //const double _UPDATE_DELAY = 1024.0;
999              //int UPDATE_DELAY = 1;              //double UPDATE_DELAY = 1;        
1000              //tmp_Results = SearchArgs.Results.GetRange(0,SearchArgs.Results.Count);              //tmp_Results = SearchArgs.Results.GetRange(0,SearchArgs.Results.Count);
1001              //SearchArgs.Results = null;              //SearchArgs.Results = null;
1002              //SearchArgs.Results.Clear();              //SearchArgs.Results.Clear();
1003              // log options              // log options
1004              SearchArgs.LogSearchOptions();              SearchArgs.LogSearchOptions();
1005              uint STEP_SIZE = (uint)SearchArgs.DataType / 8;              uint STEP_SIZE = (uint)SearchArgs.DataType / 8;            
   
1006              GenericMemoryProvider provider = new GenericMemoryProvider((IAcceptsProcessAndConfig)this);              GenericMemoryProvider provider = new GenericMemoryProvider((IAcceptsProcessAndConfig)this);
1007              provider.OpenProvider();              provider.OpenProvider();
1008              int bytes_read = 0;              int bytes_read = 0;
1009    
1010              byte[] buffered_mem = new byte[MemoryRangeSize]; // throws OutOfMemoryException if size is over 2G              byte[] buffered_mem = new byte[(MemoryRangeSize - MemoryRangeStart)]; // throws OutOfMemoryException if size is over 2G
1011              provider.ReadProcessMemoryAtOnce(MemoryRangeStart, MemoryRangeSize, out bytes_read, out buffered_mem);                      provider.ReadProcessMemoryAtOnce(MemoryRangeStart, (MemoryRangeSize - MemoryRangeStart), out bytes_read, out buffered_mem);        
1012              provider.CloseProvider();              provider.CloseProvider();
1013                
1014              if (buffered_mem.Length == 0) { logger.Warn.WriteLine("Buffered Memory is Zero Length."); return; }              if (buffered_mem.Length == 0) { logger.Warn.WriteLine("Buffered Memory is Zero Length."); return; }
1015              MemoryStream ms = new MemoryStream(buffered_mem);              //MemoryStream ms = new MemoryStream(buffered_mem);
1016              BinaryReader r_ms = new BinaryReader(ms);              //BinaryReader r_ms = new BinaryReader(ms);
1017              logger.Debug.WriteLine(string.Format("Buffered Memory Size -> 0x{0:x8}", r_ms.BaseStream.Length));              logger.Debug.WriteLine(string.Format("Buffered Memory Size -> 0x{0:x8}", buffered_mem.Length));
1018              int Last_Whole_Percent_Done = 0;              int Last_Whole_Percent_Done = 0;
1019    
1020              #region First Search              #region First Search
1021              if (SearchArgs.IsFirstSearch)              if (SearchArgs.IsFirstSearch)
1022              {              {
1023                  SearchArgs.Results.Clear();                  SearchArgs.Results.Clear();
1024                  r_ms.BaseStream.Seek(0, SeekOrigin.Begin);                  //r_ms.BaseStream.Seek(0, SeekOrigin.Begin);
1025                  for (uint i = 0; i < r_ms.BaseStream.Length; i += STEP_SIZE)                  for (uint i = 0; i < buffered_mem.Length; i += STEP_SIZE)
1026                  {                  {
1027                      ResultType<object> _tmp_result = new ResultType<object>();                      ResultType<object> _tmp_result = new ResultType<object>();
   
   
1028                      switch (SearchArgs.DataType)                      switch (SearchArgs.DataType)
1029                      {                      {
1030                          case SearchDataTypes._8bits:                          case SearchDataTypes._8bits:
1031                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, r_ms.ReadByte()); }                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, buffered_mem[i]); }
1032                              else { _tmp_result = new ResultType<object>(i, r_ms.ReadSByte()); } break;                              else { _tmp_result = new ResultType<object>(i, buffered_mem[i]); } break;
1033                          case SearchDataTypes._16bits:                          case SearchDataTypes._16bits:
1034                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, r_ms.ReadUInt16()); }                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, BitConverter.ToUInt16(buffered_mem,(int)i)); }
1035                              else { _tmp_result = new ResultType<object>(i, r_ms.ReadInt16()); } break;                              else { _tmp_result = new ResultType<object>(i,BitConverter.ToInt16(buffered_mem,(int)i)); } break;
1036                          case SearchDataTypes._32bits:                          case SearchDataTypes._32bits:
1037                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, r_ms.ReadUInt32()); }                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, BitConverter.ToUInt32(buffered_mem,(int)i)); }
1038                              else { _tmp_result = new ResultType<object>(i, r_ms.ReadInt32()); } break;                              else { _tmp_result = new ResultType<object>(i, BitConverter.ToInt32(buffered_mem,(int)i)); } break;
1039                          case SearchDataTypes._64bits:                          case SearchDataTypes._64bits:
1040                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, r_ms.ReadUInt64()); }                              if (SearchArgs.IsUnsignedDataType) { _tmp_result = new ResultType<object>(i, BitConverter.ToUInt64(buffered_mem,(int)i)); }
1041                              else { _tmp_result = new ResultType<object>(i, r_ms.ReadInt64()); } break;                              else { _tmp_result = new ResultType<object>(i, BitConverter.ToInt64(buffered_mem,(int)i)); } break;
1042                      }                      }
1043                      SearchArgs.Results.Add(_tmp_result);                      SearchArgs.Results.Add(_tmp_result);
1044                      double double_percent_done = 100.0 * (double)((double)i / (double)r_ms.BaseStream.Length);                      double double_percent_done = 100.0 * (double)((double)i / (double)buffered_mem.Length);
1045                      int int_percent_done = (int)double_percent_done;                      int int_percent_done = (int)double_percent_done;
1046                      if ((i / UPDATE_DELAY) == (int)(i / UPDATE_DELAY) && int_percent_done != Last_Whole_Percent_Done)                      if (int_percent_done != Last_Whole_Percent_Done && i % ElementsBeforeDisplay == 0)
1047                      {                      {
1048                          resultsprogress.Value = int_percent_done;                          resultsprogress.Value = int_percent_done;
1049                          resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);                          resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);
# Line 1059  namespace RomCheater.Docking Line 1056  namespace RomCheater.Docking
1056                          e.Cancel = true;                          e.Cancel = true;
1057                          return;                          return;
1058                      }                      }
1059                        Application.DoEvents();
1060                  }                  }
1061                  resultsprogress.Value = 100;                  resultsprogress.Value = 100;
1062                  resultsprogress.Message = "";                  resultsprogress.Message = "";
# Line 1069  namespace RomCheater.Docking Line 1066  namespace RomCheater.Docking
1066              #endregion              #endregion
1067    
1068              #region Subsequent Searches              #region Subsequent Searches
1069              r_ms.BaseStream.Seek(0, SeekOrigin.Begin);              //r_ms.BaseStream.Seek(0, SeekOrigin.Begin);
1070    
1071    
1072              // hack to help with OutOfMemory Exceptions (OldValue and Equal compare will always add all found search results)              // hack to help with OutOfMemory Exceptions (OldValue and Equal compare will always add all found search results)
# Line 1091  namespace RomCheater.Docking Line 1088  namespace RomCheater.Docking
1088                      ////second_tmp_Results.c                      ////second_tmp_Results.c
1089                      for (int i = 0; i < SearchArgs.Results.Count; i += 1)                      for (int i = 0; i < SearchArgs.Results.Count; i += 1)
1090                      {                      {
1091                          r_ms.BaseStream.Seek(SearchArgs.Results[i].Address, SeekOrigin.Begin);                          //r_ms.BaseStream.Seek(SearchArgs.Results[i].Address, SeekOrigin.Begin);
1092                            uint address = SearchArgs.Results[i].Address;
1093                          switch (SearchArgs.DataType)                          switch (SearchArgs.DataType)
1094                          {                          {
1095                              #region Comparer Support                              #region Comparer Support
1096                              case SearchDataTypes._8bits:                              case SearchDataTypes._8bits:
1097                                  if (SearchArgs.IsUnsignedDataType)                                  if (SearchArgs.IsUnsignedDataType)
1098                                  {                                  {
1099                                      byte lookup_value = r_ms.ReadByte();                                      byte lookup_value = buffered_mem[address];
1100                                      _8bit_unsigned_comparer_ comparer = new _8bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _8bit_unsigned_comparer_ comparer = new _8bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1101                                      byte value = 0;                                      byte value = 0;
1102                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1125  namespace RomCheater.Docking Line 1122  namespace RomCheater.Docking
1122                                  }                                  }
1123                                  else                                  else
1124                                  {                                  {
1125                                      sbyte lookup_value = r_ms.ReadSByte();                                      sbyte lookup_value = (sbyte)buffered_mem[address];
1126                                      _8bit_signed_comparer_ comparer = new _8bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _8bit_signed_comparer_ comparer = new _8bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1127                                      sbyte value = 0;                                      sbyte value = 0;
1128                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1151  namespace RomCheater.Docking Line 1148  namespace RomCheater.Docking
1148                              case SearchDataTypes._16bits:                              case SearchDataTypes._16bits:
1149                                  if (SearchArgs.IsUnsignedDataType)                                  if (SearchArgs.IsUnsignedDataType)
1150                                  {                                  {
1151                                      ushort lookup_value = r_ms.ReadUInt16();                                      ushort lookup_value = BitConverter.ToUInt16(buffered_mem,(int)address);
1152                                      _16bit_unsigned_comparer_ comparer = new _16bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _16bit_unsigned_comparer_ comparer = new _16bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1153                                      ushort value = 0;                                      ushort value = 0;
1154                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1177  namespace RomCheater.Docking Line 1174  namespace RomCheater.Docking
1174                                  }                                  }
1175                                  else                                  else
1176                                  {                                  {
1177                                      short lookup_value = r_ms.ReadInt16();                                      short lookup_value = BitConverter.ToInt16(buffered_mem,(int)address);
1178                                      _16bit_signed_comparer_ comparer = new _16bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _16bit_signed_comparer_ comparer = new _16bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1179                                      short value = 0;                                      short value = 0;
1180                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1203  namespace RomCheater.Docking Line 1200  namespace RomCheater.Docking
1200                              case SearchDataTypes._32bits:                              case SearchDataTypes._32bits:
1201                                  if (SearchArgs.IsUnsignedDataType)                                  if (SearchArgs.IsUnsignedDataType)
1202                                  {                                  {
1203                                      uint lookup_value = r_ms.ReadUInt32();                                      uint lookup_value = BitConverter.ToUInt32(buffered_mem,(int)address);
1204                                      _32bit_unsigned_comparer_ comparer = new _32bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _32bit_unsigned_comparer_ comparer = new _32bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1205                                      uint value = 0;                                      uint value = 0;
1206                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1229  namespace RomCheater.Docking Line 1226  namespace RomCheater.Docking
1226                                  }                                  }
1227                                  else                                  else
1228                                  {                                  {
1229                                      int lookup_value = r_ms.ReadInt32();                                      int lookup_value =BitConverter.ToInt32(buffered_mem,(int)address);
1230                                      _32bit_signed_comparer_ comparer = new _32bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _32bit_signed_comparer_ comparer = new _32bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1231                                      int value = 0;                                      int value = 0;
1232                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1255  namespace RomCheater.Docking Line 1252  namespace RomCheater.Docking
1252                              case SearchDataTypes._64bits:                              case SearchDataTypes._64bits:
1253                                  if (SearchArgs.IsUnsignedDataType)                                  if (SearchArgs.IsUnsignedDataType)
1254                                  {                                  {
1255                                      ulong lookup_value = r_ms.ReadUInt64();                                      ulong lookup_value = BitConverter.ToUInt64(buffered_mem,(int)address);
1256                                      _64bit_unsigned_comparer_ comparer = new _64bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _64bit_unsigned_comparer_ comparer = new _64bit_unsigned_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1257                                      ulong value = 0;                                      ulong value = 0;
1258                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1281  namespace RomCheater.Docking Line 1278  namespace RomCheater.Docking
1278                                  }                                  }
1279                                  else                                  else
1280                                  {                                  {
1281                                      long lookup_value = r_ms.ReadInt64();                                      long lookup_value = BitConverter.ToInt64(buffered_mem,(int)address);
1282                                      _64bit_signed_comparer_ comparer = new _64bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);                                      _64bit_signed_comparer_ comparer = new _64bit_signed_comparer_(SearchArgs, SearchArgs.Results[i].Address);
1283                                      long value = 0;                                      long value = 0;
1284                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)                                      if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
# Line 1309  namespace RomCheater.Docking Line 1306  namespace RomCheater.Docking
1306    
1307                          double double_percent_done = 100.0 * (double)((double)i / (double)SearchArgs.Results.Count);                          double double_percent_done = 100.0 * (double)((double)i / (double)SearchArgs.Results.Count);
1308                          int int_percent_done = (int)double_percent_done;                          int int_percent_done = (int)double_percent_done;
1309                          if ((i / UPDATE_DELAY) == (int)(i / UPDATE_DELAY) && int_percent_done != Last_Whole_Percent_Done)                          if (int_percent_done != Last_Whole_Percent_Done && i % ElementsBeforeDisplay == 0)
1310                          {                          {
1311                              resultsprogress.Value = int_percent_done;                              resultsprogress.Value = int_percent_done;
1312                              resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);                              resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);
# Line 1330  namespace RomCheater.Docking Line 1327  namespace RomCheater.Docking
1327                      end = SearchArgs.CompareEndValue;                      end = SearchArgs.CompareEndValue;
1328                      for (int i = 0; i < SearchArgs.Results.Count; i += 1)                      for (int i = 0; i < SearchArgs.Results.Count; i += 1)
1329                      {                      {
1330                          r_ms.BaseStream.Seek(SearchArgs.Results[i].Address, SeekOrigin.Begin);                          uint address = SearchArgs.Results[i].Address;
1331                            //r_ms.BaseStream.Seek(SearchArgs.Results[i].Address, SeekOrigin.Begin);
1332                          if (SearchArgs.CompareType == SearchCompareTypes.Between)                          if (SearchArgs.CompareType == SearchCompareTypes.Between)
1333                          {                          {
1334                              InRangeComparer comparer = new InRangeComparer(SearchArgs.Results[i].Address, 0);                              InRangeComparer comparer = new InRangeComparer(SearchArgs.Results[i].Address, 0);
1335                              if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, r_ms))                              if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, buffered_mem))
1336                              {                              {
1337                                  SearchArgs.Results[i].Value = comparer.Value;                                  SearchArgs.Results[i].Value = comparer.Value;
1338                                  second_tmp_Results.Add(SearchArgs.Results[i]);                                  second_tmp_Results.Add(SearchArgs.Results[i]);
# Line 1344  namespace RomCheater.Docking Line 1342  namespace RomCheater.Docking
1342                          else if (SearchArgs.CompareType == SearchCompareTypes.NotBetween)                          else if (SearchArgs.CompareType == SearchCompareTypes.NotBetween)
1343                          {                          {
1344                              NotInRangeComparer comparer = new NotInRangeComparer(SearchArgs.Results[i].Address, 0);                              NotInRangeComparer comparer = new NotInRangeComparer(SearchArgs.Results[i].Address, 0);
1345                              if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, r_ms))                              if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, buffered_mem))
1346                              {                              {
1347                                  SearchArgs.Results[i].Value = comparer.Value;                                  SearchArgs.Results[i].Value = comparer.Value;
1348                                  second_tmp_Results.Add(SearchArgs.Results[i]);                                  second_tmp_Results.Add(SearchArgs.Results[i]);
# Line 1357  namespace RomCheater.Docking Line 1355  namespace RomCheater.Docking
1355                          }                          }
1356                          double double_percent_done = 100.0 * (double)((double)i / (double)SearchArgs.Results.Count);                          double double_percent_done = 100.0 * (double)((double)i / (double)SearchArgs.Results.Count);
1357                          int int_percent_done = (int)double_percent_done;                          int int_percent_done = (int)double_percent_done;
1358                          if ((i / UPDATE_DELAY) == (int)(i / UPDATE_DELAY) && int_percent_done != Last_Whole_Percent_Done)                          if (int_percent_done != Last_Whole_Percent_Done && i % ElementsBeforeDisplay == 0)
1359                          {                          {
1360                              resultsprogress.Value = int_percent_done;                              resultsprogress.Value = int_percent_done;
1361                              resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);                              resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);
# Line 1378  namespace RomCheater.Docking Line 1376  namespace RomCheater.Docking
1376                  second_tmp_Results = null; // free memory                  second_tmp_Results = null; // free memory
1377              }              }
1378    
1379              r_ms.Close();              //r_ms.Close();
1380          }          }
1381    
1382          private void SearchWorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)          private void SearchWorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)

Legend:
Removed from v.382  
changed lines
  Added in v.384

  ViewVC Help
Powered by ViewVC 1.1.22