ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/RomCheater/trunk/RomCheater/Docking/FloatingMemorySearcher.cs
(Generate patch)

Comparing trunk/RomCheater/Docking/FloatingMemorySearcher.cs (file contents):
Revision 401 by william, Thu Jun 21 05:14:38 2012 UTC vs.
Revision 402 by william, Thu Jun 21 06:30:33 2012 UTC

--- trunk/RomCheater/Docking/FloatingMemorySearcher.cs	2012/06/21 05:14:38	401
+++ trunk/RomCheater/Docking/FloatingMemorySearcher.cs	2012/06/21 06:30:33	402
@@ -1036,7 +1036,7 @@ namespace RomCheater.Docking
             e.Result = st;
             //List<ResultType<object>> tmp_Results = new List<ResultType<object>>();
             List<ResultType<object>> second_tmp_Results = new List<ResultType<object>>();
-            const int ElementsBeforeDisplay = 100;
+            //const int ElementsBeforeDisplay = 100;
             SearchArgs.LogSearchOptions();
             uint STEP_SIZE = (uint)SearchArgs.DataType / 8;
 
@@ -1130,7 +1130,7 @@ namespace RomCheater.Docking
                         SearchArgs.IsFirstSearch)
                     {
                         NeedToCompare = false;
-                        second_tmp_Results = null; // Free Memory
+                        //second_tmp_Results = null; // Free Memory
                     }
 
                     if (NeedToCompare)
@@ -1141,243 +1141,215 @@ namespace RomCheater.Docking
                             st_nonrange_search.Start();
                             //second_tmp_Results = new List<ResultType<object>>(SearchArgs.Results.Count * 1024);
                             ////second_tmp_Results.c
-                            for (int i = 0; i < SearchArgs.Results.Count; i += 1)
+
+                            using (SearchResultReader reader = new SearchResultReader())
                             {
-                                uint address = SearchArgs.Results[i].Address;
-                                if (MemoryRangeStart > 0 && !SearchArgs.IsFirstSearch) { address = address - MemoryRangeStart; }
-                                r_ms.BaseStream.Seek(address, SeekOrigin.Begin);
-                                switch (SearchArgs.DataType)
+                                for (int i = 0; i < reader.ResultCount; i += 1)
                                 {
-                                    #region Comparer Support
-                                    #region case SearchDataTypes._8bits:
-                                    case SearchDataTypes._8bits:
-                                        if (SearchArgs.IsUnsignedDataType)
-                                        {
-                                            byte lookup_value = r_ms.ReadByte();
-                                            _8bit_unsigned_comparer_ comparer = new _8bit_unsigned_comparer_(SearchArgs, address);
-                                            byte value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToByte(SearchArgs.Results[i].Value);
-                                                comparer.Value = value;
-                                            }
-                                            else
-                                            {
-                                                value = Convert.ToByte(SearchArgs.CompareStartValue);
-                                                comparer.Value = value;
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        else
-                                        {
-                                            sbyte lookup_value = r_ms.ReadSByte();
-                                            _8bit_signed_comparer_ comparer = new _8bit_signed_comparer_(SearchArgs, address);
-                                            sbyte value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToSByte(SearchArgs.Results[i].Value);
-                                            }
-                                            else
-                                            {
-                                                value = Convert.ToSByte(SearchArgs.CompareStartValue);
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        break;
-                                    #endregion
-                                    #region case SearchDataTypes._16bits:
-                                    case SearchDataTypes._16bits:
-                                        if (SearchArgs.IsUnsignedDataType)
-                                        {
-                                            ushort lookup_value = r_ms.ReadUInt16();
-                                            _16bit_unsigned_comparer_ comparer = new _16bit_unsigned_comparer_(SearchArgs, address);
-                                            ushort value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToUInt16(SearchArgs.Results[i].Value);
-                                                comparer.Value = value;
-                                            }
-                                            else
-                                            {
-                                                value = Convert.ToUInt16(SearchArgs.CompareStartValue);
-                                                comparer.Value = value;
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        else
-                                        {
-                                            short lookup_value = r_ms.ReadInt16();
-                                            _16bit_signed_comparer_ comparer = new _16bit_signed_comparer_(SearchArgs, address);
-                                            short value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToInt16(SearchArgs.Results[i].Value);
-                                            }
-                                            else
-                                            {
-                                                value = Convert.ToInt16(SearchArgs.CompareStartValue);
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        break;
-                                    #endregion
-                                    #region case SearchDataTypes._32bits:
-                                    case SearchDataTypes._32bits:
-                                        if (SearchArgs.IsUnsignedDataType)
-                                        {
-                                            uint lookup_value = r_ms.ReadUInt32();
-                                            _32bit_unsigned_comparer_ comparer = new _32bit_unsigned_comparer_(SearchArgs, address);
-                                            uint value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToUInt32(SearchArgs.Results[i].Value);
-                                                comparer.Value = value;
+                                    uint address = reader.CurrentAddress();
+                                    if (MemoryRangeStart > 0 && !SearchArgs.IsFirstSearch) { address = address - MemoryRangeStart; }
+                                    r_ms.BaseStream.Seek(address, SeekOrigin.Begin);
+                                    switch (SearchArgs.DataType)
+                                    {
+                                        #region Comparer Support
+                                        #region case SearchDataTypes._8bits:
+                                        case SearchDataTypes._8bits:
+                                            if (SearchArgs.IsUnsignedDataType)
+                                            {
+                                                byte lookup_value = r_ms.ReadByte();
+                                                _8bit_unsigned_comparer_ comparer = new _8bit_unsigned_comparer_(SearchArgs, address);
+                                                byte value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<byte>();
+                                                    comparer.Value = value;
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToByte(SearchArgs.CompareStartValue);
+                                                    comparer.Value = value;
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
                                             }
                                             else
                                             {
-                                                value = Convert.ToUInt32(SearchArgs.CompareStartValue);
-                                                comparer.Value = value;
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        else
-                                        {
-                                            int lookup_value = r_ms.ReadInt32();
-                                            _32bit_signed_comparer_ comparer = new _32bit_signed_comparer_(SearchArgs, address);
-                                            int value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToInt32(SearchArgs.Results[i].Value);
+                                                sbyte lookup_value = r_ms.ReadSByte();
+                                                _8bit_signed_comparer_ comparer = new _8bit_signed_comparer_(SearchArgs, address);
+                                                sbyte value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<sbyte>();
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToSByte(SearchArgs.CompareStartValue);
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
+                                            }
+                                            break;
+                                        #endregion
+                                        #region case SearchDataTypes._16bits:
+                                        case SearchDataTypes._16bits:
+                                            if (SearchArgs.IsUnsignedDataType)
+                                            {
+                                                ushort lookup_value = r_ms.ReadUInt16();
+                                                _16bit_unsigned_comparer_ comparer = new _16bit_unsigned_comparer_(SearchArgs, address);
+                                                ushort value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<ushort>();
+                                                    comparer.Value = value;
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToUInt16(SearchArgs.CompareStartValue);
+                                                    comparer.Value = value;
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
                                             }
                                             else
                                             {
-                                                value = Convert.ToInt32(SearchArgs.CompareStartValue);
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        break;
-                                    #endregion
-                                    #region case SearchDataTypes._64bits:
-                                    case SearchDataTypes._64bits:
-                                        if (SearchArgs.IsUnsignedDataType)
-                                        {
-                                            ulong lookup_value = r_ms.ReadUInt64();
-                                            _64bit_unsigned_comparer_ comparer = new _64bit_unsigned_comparer_(SearchArgs, address);
-                                            ulong value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToUInt64(SearchArgs.Results[i].Value);
-                                                comparer.Value = value;
+                                                short lookup_value = r_ms.ReadInt16();
+                                                _16bit_signed_comparer_ comparer = new _16bit_signed_comparer_(SearchArgs, address);
+                                                short value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<short>();
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToInt16(SearchArgs.CompareStartValue);
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
+                                            }
+                                            break;
+                                        #endregion
+                                        #region case SearchDataTypes._32bits:
+                                        case SearchDataTypes._32bits:
+                                            if (SearchArgs.IsUnsignedDataType)
+                                            {
+                                                uint lookup_value = reader.CurrentResult<uint>();
+                                                _32bit_unsigned_comparer_ comparer = new _32bit_unsigned_comparer_(SearchArgs, address);
+                                                uint value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<uint>();
+                                                    comparer.Value = value;
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToUInt32(SearchArgs.CompareStartValue);
+                                                    comparer.Value = value;
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
                                             }
                                             else
                                             {
-                                                value = Convert.ToUInt64(SearchArgs.CompareStartValue);
-                                                comparer.Value = value;
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        else
-                                        {
-                                            long lookup_value = r_ms.ReadInt64();
-                                            _64bit_signed_comparer_ comparer = new _64bit_signed_comparer_(SearchArgs, address);
-                                            long value = 0;
-                                            if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
-                                            {
-                                                value = Convert.ToInt64(SearchArgs.Results[i].Value);
+                                                int lookup_value = r_ms.ReadInt32();
+                                                _32bit_signed_comparer_ comparer = new _32bit_signed_comparer_(SearchArgs, address);
+                                                int value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<int>();
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToInt32(SearchArgs.CompareStartValue);
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
+                                            }
+                                            break;
+                                        #endregion
+                                        #region case SearchDataTypes._64bits:
+                                        case SearchDataTypes._64bits:
+                                            if (SearchArgs.IsUnsignedDataType)
+                                            {
+                                                ulong lookup_value = r_ms.ReadUInt64();
+                                                _64bit_unsigned_comparer_ comparer = new _64bit_unsigned_comparer_(SearchArgs, address);
+                                                ulong value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<ulong>();
+                                                    comparer.Value = value;
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToUInt64(SearchArgs.CompareStartValue);
+                                                    comparer.Value = value;
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
                                             }
                                             else
                                             {
-                                                value = Convert.ToInt64(SearchArgs.CompareStartValue);
-                                            }
-                                            if (comparer.Compare(lookup_value, value))
-                                            {
-                                                //ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);                                    
-                                                //second_tmp_Results.Add(_tmp_result);
-                                                //_tmp_result = null; // free memory
-                                                //SearchArgs.Results.RemoveAt(i);
-                                                SearchArgs.Results[i].Value = comparer.Value;
-                                                second_tmp_Results.Add(SearchArgs.Results[i]);
-                                            }
-                                            comparer = null; // free memory
-                                        }
-                                        break;
-                                    #endregion
-                                    #endregion
-                                }
+                                                long lookup_value = r_ms.ReadInt64();
+                                                _64bit_signed_comparer_ comparer = new _64bit_signed_comparer_(SearchArgs, address);
+                                                long value = 0;
+                                                if (SearchArgs.CompareValueType == CompareValueTypes.OldValue)
+                                                {
+                                                    value = reader.CurrentResult<long>();
+                                                }
+                                                else
+                                                {
+                                                    value = Convert.ToInt64(SearchArgs.CompareStartValue);
+                                                }
+                                                if (comparer.Compare(lookup_value, value))
+                                                {
+                                                    ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                                    second_tmp_Results.Add(_tmp_result);
+                                                }
+                                                comparer = null; // free memory
+                                            }
+                                            break;
+                                        #endregion
+                                        #endregion
+                                    }
 
-                                double double_percent_done = 100.0 * (double)((double)i / (double)SearchArgs.Results.Count);
-                                int int_percent_done = (int)double_percent_done;
-                                if (int_percent_done != Last_Whole_Percent_Done && i % ElementsBeforeDisplay == 0)
-                                {
-                                    resultsprogress.Value = int_percent_done;
-                                    resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);
-                                    Last_Whole_Percent_Done = int_percent_done;
-                                    //Application.DoEvents();
-                                }
+                                    double double_percent_done = 100.0 * (double)((double)i / (double)reader.ResultCount);
+                                    int int_percent_done = (int)double_percent_done;
+                                    if (int_percent_done != Last_Whole_Percent_Done)
+                                    {
+                                        resultsprogress.Value = int_percent_done;
+                                        resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i + MemoryRangeStart);
+                                        Last_Whole_Percent_Done = int_percent_done;
+                                        //Application.DoEvents();
+                                    }
 
+                                }
                             }
                             st_nonrange_search.Stop();
                             logger.Profiler.WriteLine("Non-Ranged search took a total of {0} seconds to complete.", st_nonrange_search.Elapsed.TotalSeconds);
@@ -1392,43 +1364,46 @@ namespace RomCheater.Docking
 
                             start = SearchArgs.CompareStartValue;
                             end = SearchArgs.CompareEndValue;
-                            for (int i = 0; i < SearchArgs.Results.Count; i += 1)
+                            using (SearchResultReader reader = new SearchResultReader())
                             {
-                                uint address = SearchArgs.Results[i].Address;
-                                if (MemoryRangeStart > 0 && !SearchArgs.IsFirstSearch) { address = address - MemoryRangeStart; }
-                                r_ms.BaseStream.Seek(address, SeekOrigin.Begin);
-                                if (SearchArgs.CompareType == SearchCompareTypes.Between)
+                                for (int i = 0; i < reader.ResultCount; i += 1)
                                 {
-                                    InRangeComparer comparer = new InRangeComparer(address, 0);
-                                    if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, r_ms))
+                                    uint address = reader.CurrentAddress();
+                                    if (MemoryRangeStart > 0 && !SearchArgs.IsFirstSearch) { address = address - MemoryRangeStart; }
+                                    r_ms.BaseStream.Seek(address, SeekOrigin.Begin);
+                                    if (SearchArgs.CompareType == SearchCompareTypes.Between)
                                     {
-                                        SearchArgs.Results[i].Value = comparer.Value;
-                                        second_tmp_Results.Add(SearchArgs.Results[i]);
+                                        InRangeComparer comparer = new InRangeComparer(address, 0);
+                                        if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, r_ms))
+                                        {
+                                            ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                            second_tmp_Results.Add(_tmp_result);
+                                        }
+                                        comparer = null;
                                     }
-                                    comparer = null;
-                                }
-                                else if (SearchArgs.CompareType == SearchCompareTypes.NotBetween)
-                                {
-                                    NotInRangeComparer comparer = new NotInRangeComparer(address, 0);
-                                    if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, r_ms))
+                                    else if (SearchArgs.CompareType == SearchCompareTypes.NotBetween)
                                     {
-                                        SearchArgs.Results[i].Value = comparer.Value;
-                                        second_tmp_Results.Add(SearchArgs.Results[i]);
+                                        NotInRangeComparer comparer = new NotInRangeComparer(address, 0);
+                                        if (comparer.Compare(start, end, SearchArgs.DataType, SearchArgs.IsUnsignedDataType, r_ms))
+                                        {
+                                            ResultType<object> _tmp_result = new ResultType<object>(comparer.Address, comparer.Value);
+                                            second_tmp_Results.Add(_tmp_result);
+                                        }
+                                        comparer = null;
+                                    }
+                                    else
+                                    {
+                                        throw new InvalidOperationException("Encounted unkown range search type: " + SearchArgs.CompareType);
+                                    }
+                                    double double_percent_done = 100.0 * (double)((double)i / (double)reader.ResultCount);
+                                    int int_percent_done = (int)double_percent_done;
+                                    if (int_percent_done != Last_Whole_Percent_Done)
+                                    {
+                                        resultsprogress.Value = int_percent_done;
+                                        resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i + MemoryRangeStart);
+                                        Last_Whole_Percent_Done = int_percent_done;
+                                        //Application.DoEvents();
                                     }
-                                    comparer = null;
-                                }
-                                else
-                                {
-                                    throw new InvalidOperationException("Encounted unkown range search type: " + SearchArgs.CompareType);
-                                }
-                                double double_percent_done = 100.0 * (double)((double)i / (double)SearchArgs.Results.Count);
-                                int int_percent_done = (int)double_percent_done;
-                                if (int_percent_done != Last_Whole_Percent_Done && i % ElementsBeforeDisplay == 0)
-                                {
-                                    resultsprogress.Value = int_percent_done;
-                                    resultsprogress.Message = string.Format(" -> Reading Address: 0x{0:x8}", i);
-                                    Last_Whole_Percent_Done = int_percent_done;
-                                    //Application.DoEvents();
                                 }
                             }
                             st_ranged_search.Stop();
@@ -1442,10 +1417,33 @@ namespace RomCheater.Docking
                     // leave SearchArgs.Results alone, if false
                     if (NeedToCompare)
                     {
-                        SearchArgs.Results = second_tmp_Results.GetRange(0, second_tmp_Results.Count);
                         // fix addresses when memory start is not zero
-                        if (MemoryRangeStart > 0 && SearchArgs.IsFirstSearch) { for (int i = 0; i < SearchArgs.Results.Count; i++) { SearchArgs.Results[i].Address = SearchArgs.Results[i].Address + MemoryRangeStart; } }
-                        second_tmp_Results = null; // free memory
+                        if (MemoryRangeStart > 0 && SearchArgs.IsFirstSearch)
+                        {
+                            using (SearchResultWriter writer = new SearchResultWriter(second_tmp_Results.Count))
+                            {
+                                for (int i = 0; i < second_tmp_Results.Count; i++)
+                                {
+                                    second_tmp_Results[i].Address = second_tmp_Results[i].Address + MemoryRangeStart;
+                                    switch (sdt)
+                                    {
+                                        case SearchDataTypes._8bits:
+                                            if (unsigned) { writer.WriteResult<Byte>((uint)i, Convert.ToByte(second_tmp_Results[i].Value)); }
+                                            else { writer.WriteResult<SByte>((uint)i, Convert.ToSByte(second_tmp_Results[i].Value)); } break;
+                                        case SearchDataTypes._16bits:
+                                            if (unsigned) { writer.WriteResult<UInt16>((uint)i, Convert.ToUInt16(second_tmp_Results[i].Value)); }
+                                            else { writer.WriteResult<Int16>((uint)i, Convert.ToInt16(second_tmp_Results[i].Value)); } break;
+                                        case SearchDataTypes._32bits:
+                                            if (unsigned) { writer.WriteResult<UInt32>((uint)i, Convert.ToUInt32(second_tmp_Results[i].Value)); }
+                                            else { writer.WriteResult<Int32>((uint)i,Convert.ToInt32(second_tmp_Results[i].Value)); } break;
+                                        case SearchDataTypes._64bits:
+                                            if (unsigned) { writer.WriteResult<UInt64>((uint)i, Convert.ToUInt64(second_tmp_Results[i].Value)); }
+                                            else { writer.WriteResult<Int64>((uint)i, Convert.ToInt64(second_tmp_Results[i].Value)); } break;
+                                    }
+                                }
+                            }
+                        }
+                        second_tmp_Results = null; // free memory                       
                     }
 
                     r_ms.Close();
@@ -1472,47 +1470,53 @@ namespace RomCheater.Docking
             }
             
             resultsprogress.Value = 100;
-            logger.Debug.WriteLine(string.Format("Results Count -> 0x{0:x8}", SearchArgs.Results.Count));
 
-            if (SearchArgs.Results.Count == 1) // debug message for 1 result using 32bit unsigned
-                logger.Debug.WriteLine(string.Format("Debug: Found 1 result -> Address: 0x{0:x8} Value: 0x{1:x8}", SearchArgs.Results[0].Address, SearchArgs.Results[0].Value));
+            using (SearchResultReader reader = new SearchResultReader())
+            {
 
-           logger.Info.WriteLine(string.Format("Found 0x{0:x8} results", SearchArgs.Results.Count));
+                logger.Debug.WriteLine(string.Format("Results Count -> 0x{0:x8}", reader.ResultCount));
 
-            if (SearchArgs.Results.Count <= MIN_NUMBER_OF_RESULTS_BEFORE_DISPLAY)
-            {
-                lstResults.Items.Clear();
-                List<ResultItem> items = new List<ResultItem>();
-                for (int i = 0; i < SearchArgs.Results.Count; i++)
+
+                if (reader.ResultCount == 1) // debug message for 1 result using 32bit unsigned
+                    logger.Debug.WriteLine(string.Format("Debug: Found 1 result -> Address: 0x{0:x8} Value: 0x{1:x16}", reader.CurrentAddress(), reader.CurrentResult<ulong>()));
+
+                logger.Info.WriteLine(string.Format("Found 0x{0:x8} results", reader.ResultCount));
+
+                if (reader.ResultCount <= MIN_NUMBER_OF_RESULTS_BEFORE_DISPLAY)
                 {
-                    ResultItem item = new ResultItem(0, false);
-                    //item.Text = string.Format("0x{0:x8}", SearchArgs.Results[i].Address);
-                    //item.SubItems.Add(string.Format("0x{0:x8}", SearchArgs.Results[i].Address));
-                    switch (SearchArgs.DataType)
+                    lstResults.Items.Clear();
+                    List<ResultItem> items = new List<ResultItem>();
+                    for (int i = 0; i < reader.ResultCount; i++)
                     {
+                        ResultItem item = new ResultItem(0, false);
+                        //item.Text = string.Format("0x{0:x8}", SearchArgs.Results[i].Address);
+                        //item.SubItems.Add(string.Format("0x{0:x8}", SearchArgs.Results[i].Address));
+                        switch (SearchArgs.DataType)
+                        {
 
-                        case SearchDataTypes._8bits:
-                            if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToByte(SearchArgs.Results[i].Value)); }
-                            else { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToSByte(SearchArgs.Results[i].Value)); }
-                            break;
-                        case SearchDataTypes._16bits:
-                            if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToUInt16(SearchArgs.Results[i].Value)); }
-                            else { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToInt16(SearchArgs.Results[i].Value)); }
-                            break;
-                        case SearchDataTypes._32bits:
-                            if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToUInt32(SearchArgs.Results[i].Value)); }
-                            else { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToInt32(SearchArgs.Results[i].Value)); }
-                            break;
-                        case SearchDataTypes._64bits:
-                            if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToUInt64(SearchArgs.Results[i].Value)); }
-                            else { item = new ResultItem(SearchArgs.Results[i].Address, false, Convert.ToInt64(SearchArgs.Results[i].Value)); }
-                            break;
-                    }
+                            case SearchDataTypes._8bits:
+                                if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<byte>()); }
+                                else { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<sbyte>()); }
+                                break;
+                            case SearchDataTypes._16bits:
+                                if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<ushort>()); }
+                                else { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<short>()); }
+                                break;
+                            case SearchDataTypes._32bits:
+                                if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<uint>()); }
+                                else { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<int>()); }
+                                break;
+                            case SearchDataTypes._64bits:
+                                if (SearchArgs.IsUnsignedDataType) { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<ulong>()); }
+                                else { item = new ResultItem(reader.CurrentAddress(), false, reader.CurrentResult<long>()); }
+                                break;
+                        }
 
-                    if (!items.Contains(item))
-                        items.Add(item);
+                        if (!items.Contains(item))
+                            items.Add(item);
+                    }
+                    lstResults.Items.AddRange(items.ToArray());
                 }
-                lstResults.Items.AddRange(items.ToArray());
             }
 
             this.DoSearchDoneSpecific();
@@ -1675,7 +1679,7 @@ namespace RomCheater.Docking
             if (!args.IsFirstSearch && SearchArgs != null)
             {
                 //args.Results.AddRange(SearchArgs.Results.ToArray());
-                args.Results = SearchArgs.Results;
+                //args.Results = SearchArgs.Results;
             }
             SearchArgs = args;
 #if DONOT_HAVE_RANGED_SEARCH_SUPPORT
@@ -1705,8 +1709,8 @@ namespace RomCheater.Docking
             //btnCancel.Enabled = false;
             this.DoResetSpecific();
             lstResults.Items.Clear();
-            try { SearchArgs.Results = new List<ResultType<object>>(); }
-            catch { }
+            //try { SearchArgs.Results = new List<ResultType<object>>(); }
+            //catch { }
         }
 
         private void btnCancel_Click(object sender, EventArgs e)