Skip to content

Commit 15b0886

Browse files
committed
Replaced BitConverter with EndianBitConverter.
1 parent c0f7e53 commit 15b0886

17 files changed

+149
-102
lines changed

ReClass.NET/Forms/MainForm.cs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -588,17 +588,19 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg
588588
return;
589589
}
590590

591+
var bitConverter = Program.RemoteProcess.BitConverter;
592+
591593
IScanComparer comparer;
592594
switch (selectedNode.Node)
593595
{
594596
case BaseHexNode node:
595597
comparer = new ArrayOfBytesMemoryComparer(node.ReadValueFromMemory(selectedNode.Memory));
596598
break;
597599
case FloatNode node:
598-
comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0f);
600+
comparer = new FloatMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0f, bitConverter);
599601
break;
600602
case DoubleNode node:
601-
comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0);
603+
comparer = new DoubleMemoryComparer(ScanCompareType.Equal, ScanRoundMode.Normal, 2, node.ReadValueFromMemory(selectedNode.Memory), 0.0, bitConverter);
602604
break;
603605
case Int8Node node:
604606
comparer = new ByteMemoryComparer(ScanCompareType.Equal, (byte)node.ReadValueFromMemory(selectedNode.Memory), 0);
@@ -607,40 +609,40 @@ private void searchForEqualValuesToolStripMenuItem_Click(object sender, EventArg
607609
comparer = new ByteMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0);
608610
break;
609611
case Int16Node node:
610-
comparer = new ShortMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0);
612+
comparer = new ShortMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter);
611613
break;
612614
case UInt16Node node:
613-
comparer = new ShortMemoryComparer(ScanCompareType.Equal, (short)node.ReadValueFromMemory(selectedNode.Memory), 0);
615+
comparer = new ShortMemoryComparer(ScanCompareType.Equal, (short)node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter);
614616
break;
615617
case Int32Node node:
616-
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0);
618+
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter);
617619
break;
618620
case UInt32Node node:
619-
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)node.ReadValueFromMemory(selectedNode.Memory), 0);
621+
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)node.ReadValueFromMemory(selectedNode.Memory), 0, bitConverter);
620622
break;
621623
case Int64Node node:
622-
comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0L);
624+
comparer = new LongMemoryComparer(ScanCompareType.Equal, node.ReadValueFromMemory(selectedNode.Memory), 0L, bitConverter);
623625
break;
624626
case UInt64Node node:
625-
comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0L);
627+
comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)node.ReadValueFromMemory(selectedNode.Memory), 0L, bitConverter);
626628
break;
627629
case NIntNode node:
628630
{
629631
var value = node.ReadValueFromMemory(selectedNode.Memory);
630632
#if RECLASSNET64
631-
comparer = new LongMemoryComparer(ScanCompareType.Equal, value.ToInt64(), 0L);
633+
comparer = new LongMemoryComparer(ScanCompareType.Equal, value.ToInt64(), 0L, bitConverter);
632634
#else
633-
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, value.ToInt32(), 0);
635+
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, value.ToInt32(), 0, bitConverter);
634636
#endif
635637
break;
636638
}
637639
case NUIntNode node:
638640
{
639641
var value = node.ReadValueFromMemory(selectedNode.Memory);
640642
#if RECLASSNET64
641-
comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)value.ToUInt64(), 0L);
643+
comparer = new LongMemoryComparer(ScanCompareType.Equal, (long)value.ToUInt64(), 0L, bitConverter);
642644
#else
643-
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)value.ToUInt32(), 0);
645+
comparer = new IntegerMemoryComparer(ScanCompareType.Equal, (int)value.ToUInt32(), 0, bitConverter);
644646
#endif
645647
break;
646648
}

ReClass.NET/Forms/ScannerForm.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -758,11 +758,11 @@ private IScanComparer CreateComparer(ScanSettings settings)
758758
case ScanValueType.Byte:
759759
return new ByteMemoryComparer(compareType, (byte)value1, (byte)value2);
760760
case ScanValueType.Short:
761-
return new ShortMemoryComparer(compareType, (short)value1, (short)value2);
761+
return new ShortMemoryComparer(compareType, (short)value1, (short)value2, process.BitConverter);
762762
case ScanValueType.Integer:
763-
return new IntegerMemoryComparer(compareType, (int)value1, (int)value2);
763+
return new IntegerMemoryComparer(compareType, (int)value1, (int)value2, process.BitConverter);
764764
case ScanValueType.Long:
765-
return new LongMemoryComparer(compareType, value1, value2);
765+
return new LongMemoryComparer(compareType, value1, value2, process.BitConverter);
766766
}
767767
}
768768
else if (settings.ValueType == ScanValueType.Float || settings.ValueType == ScanValueType.Double)
@@ -806,9 +806,9 @@ int CalculateSignificantDigits(string input, NumberFormatInfo numberFormat)
806806
switch (settings.ValueType)
807807
{
808808
case ScanValueType.Float:
809-
return new FloatMemoryComparer(compareType, roundMode, significantDigits, (float)value1, (float)value2);
809+
return new FloatMemoryComparer(compareType, roundMode, significantDigits, (float)value1, (float)value2, process.BitConverter);
810810
case ScanValueType.Double:
811-
return new DoubleMemoryComparer(compareType, roundMode, significantDigits, value1, value2);
811+
return new DoubleMemoryComparer(compareType, roundMode, significantDigits, value1, value2, process.BitConverter);
812812
}
813813
}
814814
else if (settings.ValueType == ScanValueType.ArrayOfBytes)

ReClass.NET/Memory/IRemoteMemoryReader.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
using System;
22
using System.Text;
3+
using ReClassNET.Util.Conversion;
34

45
namespace ReClassNET.Memory
56
{
67
public interface IRemoteMemoryReader
78
{
9+
EndianBitConverter BitConverter { get; set; }
10+
811
/// <summary>Reads remote memory from the address into the buffer.</summary>
912
/// <param name="address">The address to read from.</param>
1013
/// <param name="buffer">[out] The data buffer to fill. If the remote process is not valid, the buffer will get filled with zeros.</param>

ReClass.NET/Memory/IRemoteMemoryWriter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
using System;
1+
using System;
2+
using ReClassNET.Util.Conversion;
23

34
namespace ReClassNET.Memory
45
{
56
public interface IRemoteMemoryWriter
67
{
8+
EndianBitConverter BitConverter { get; set; }
9+
710
/// <summary>Writes the given <paramref name="data"/> to the <paramref name="address"/> in the remote process.</summary>
811
/// <param name="address">The address to write to.</param>
912
/// <param name="data">The data to write.</param>

ReClass.NET/Memory/MemoryBuffer.cs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
using System;
22
using System.Diagnostics.Contracts;
3-
using System.Runtime.InteropServices;
43
using System.Text;
54
using ReClassNET.Extensions;
5+
using ReClassNET.Util.Conversion;
66

77
namespace ReClassNET.Memory
88
{
@@ -15,6 +15,8 @@ public class MemoryBuffer
1515

1616
public byte[] RawData => data;
1717

18+
public EndianBitConverter BitConverter { get; set; } = EndianBitConverter.System;
19+
1820
public int Size
1921
{
2022
get => data.Length;
@@ -52,25 +54,18 @@ public MemoryBuffer()
5254
historyData = Array.Empty<byte>();
5355
}
5456

55-
public MemoryBuffer(MemoryBuffer other)
56-
{
57-
Contract.Requires(other != null);
58-
Contract.Ensures(data != null);
59-
Contract.Ensures(historyData != null);
60-
61-
data = other.data;
62-
historyData = other.historyData;
63-
hasHistory = other.hasHistory;
64-
65-
ContainsValidData = other.ContainsValidData;
66-
}
67-
6857
public MemoryBuffer Clone()
6958
{
7059
Contract.Ensures(Contract.Result<MemoryBuffer>() != null);
7160

72-
return new MemoryBuffer(this)
61+
return new MemoryBuffer
7362
{
63+
data = data,
64+
historyData = historyData,
65+
hasHistory = hasHistory,
66+
67+
BitConverter = BitConverter,
68+
ContainsValidData = ContainsValidData,
7469
Offset = Offset
7570
};
7671
}
@@ -90,6 +85,8 @@ public void UpdateFrom(IRemoteMemoryReader reader, IntPtr address)
9085

9186
hasHistory = ContainsValidData;
9287

88+
BitConverter = reader.BitConverter;
89+
9390
ContainsValidData = reader.ReadRemoteMemoryIntoBuffer(address, ref data);
9491
if (!ContainsValidData)
9592
{

ReClass.NET/Memory/RemoteProcess.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using ReClassNET.MemoryScanner;
1414
using ReClassNET.Native;
1515
using ReClassNET.Symbols;
16+
using ReClassNET.Util.Conversion;
1617

1718
namespace ReClassNET.Memory
1819
{
@@ -56,6 +57,8 @@ public class RemoteProcess : IDisposable, IRemoteMemoryReader, IRemoteMemoryWrit
5657

5758
public SymbolStore Symbols => symbols;
5859

60+
public EndianBitConverter BitConverter { get; set; } = EndianBitConverter.System;
61+
5962
/// <summary>Gets a copy of the current modules list. This list may change if the remote process (un)loads a module.</summary>
6063
public IEnumerable<Module> Modules
6164
{

ReClass.NET/MemoryScanner/Comparer/DoubleMemoryComparer.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Diagnostics;
33
using ReClassNET.Extensions;
4+
using ReClassNET.Util.Conversion;
45

56
namespace ReClassNET.MemoryScanner.Comparer
67
{
@@ -16,7 +17,9 @@ public class DoubleMemoryComparer : ISimpleScanComparer
1617
private readonly double minValue;
1718
private readonly double maxValue;
1819

19-
public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, double value1, double value2)
20+
private readonly EndianBitConverter bitConverter;
21+
22+
public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, double value1, double value2, EndianBitConverter bitConverter)
2023
{
2124
CompareType = compareType;
2225

@@ -29,11 +32,13 @@ public DoubleMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType
2932

3033
minValue = value1 - 1.0 / factor;
3134
maxValue = value1 + 1.0 / factor;
35+
36+
this.bitConverter = bitConverter;
3237
}
3338

3439
private bool CheckRoundedEquality(double value) =>
3540
RoundType switch
36-
{
41+
{
3742
ScanRoundMode.Strict => Value1.IsNearlyEqual(Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001),
3843
ScanRoundMode.Normal => minValue < value && value < maxValue,
3944
ScanRoundMode.Truncate => (long)value == (long)Value1,
@@ -46,7 +51,7 @@ public bool Compare(byte[] data, int index, out ScanResult result)
4651
data,
4752
index,
4853
value => CompareType switch
49-
{
54+
{
5055
ScanCompareType.Equal => CheckRoundedEquality(value),
5156
ScanCompareType.NotEqual => !CheckRoundedEquality(value),
5257
ScanCompareType.GreaterThan => value > Value1,
@@ -60,7 +65,7 @@ public bool Compare(byte[] data, int index, out ScanResult result)
6065
},
6166
out result
6267
);
63-
}
68+
}
6469

6570
public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result)
6671
{
@@ -77,7 +82,7 @@ public bool Compare(byte[] data, int index, DoubleScanResult previous, out ScanR
7782
data,
7883
index,
7984
value => CompareType switch
80-
{
85+
{
8186
ScanCompareType.Equal => CheckRoundedEquality(value),
8287
ScanCompareType.NotEqual => !CheckRoundedEquality(value),
8388
ScanCompareType.Changed => value != previous.Value,
@@ -98,11 +103,11 @@ out result
98103
);
99104
}
100105

101-
private static bool CompareInternal(byte[] data, int index, Func<double, bool> matcher, out ScanResult result)
106+
private bool CompareInternal(byte[] data, int index, Func<double, bool> matcher, out ScanResult result)
102107
{
103108
result = null;
104109

105-
var value = BitConverter.ToDouble(data, index);
110+
var value = bitConverter.ToDouble(data, index);
106111

107112
if (!matcher(value))
108113
{

ReClass.NET/MemoryScanner/Comparer/FloatMemoryComparer.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Diagnostics;
33
using ReClassNET.Extensions;
4+
using ReClassNET.Util.Conversion;
45

56
namespace ReClassNET.MemoryScanner.Comparer
67
{
@@ -16,7 +17,9 @@ public class FloatMemoryComparer : ISimpleScanComparer
1617
private readonly float minValue;
1718
private readonly float maxValue;
1819

19-
public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, float value1, float value2)
20+
private readonly EndianBitConverter bitConverter;
21+
22+
public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType, int significantDigits, float value1, float value2, EndianBitConverter bitConverter)
2023
{
2124
CompareType = compareType;
2225

@@ -29,11 +32,13 @@ public FloatMemoryComparer(ScanCompareType compareType, ScanRoundMode roundType,
2932

3033
minValue = value1 - 1.0f / factor;
3134
maxValue = value1 + 1.0f / factor;
35+
36+
this.bitConverter = bitConverter;
3237
}
3338

3439
private bool CheckRoundedEquality(float value) =>
3540
RoundType switch
36-
{
41+
{
3742
ScanRoundMode.Strict => Value1.IsNearlyEqual((float)Math.Round(value, significantDigits, MidpointRounding.AwayFromZero), 0.0001f),
3843
ScanRoundMode.Normal => minValue < value && value < maxValue,
3944
ScanRoundMode.Truncate => (int)value == (int)Value1,
@@ -46,7 +51,7 @@ public bool Compare(byte[] data, int index, out ScanResult result)
4651
data,
4752
index,
4853
value => CompareType switch
49-
{
54+
{
5055
ScanCompareType.Equal => CheckRoundedEquality(value),
5156
ScanCompareType.NotEqual => !CheckRoundedEquality(value),
5257
ScanCompareType.GreaterThan => value > Value1,
@@ -60,7 +65,7 @@ public bool Compare(byte[] data, int index, out ScanResult result)
6065
},
6166
out result
6267
);
63-
}
68+
}
6469

6570
public bool Compare(byte[] data, int index, ScanResult previous, out ScanResult result)
6671
{
@@ -77,7 +82,7 @@ public bool Compare(byte[] data, int index, FloatScanResult previous, out ScanRe
7782
data,
7883
index,
7984
value => CompareType switch
80-
{
85+
{
8186
ScanCompareType.Equal => CheckRoundedEquality(value),
8287
ScanCompareType.NotEqual => !CheckRoundedEquality(value),
8388
ScanCompareType.Changed => value != previous.Value,
@@ -98,11 +103,11 @@ out result
98103
);
99104
}
100105

101-
private static bool CompareInternal(byte[] data, int index, Func<float, bool> matcher, out ScanResult result)
106+
private bool CompareInternal(byte[] data, int index, Func<float, bool> matcher, out ScanResult result)
102107
{
103108
result = null;
104109

105-
var value = BitConverter.ToSingle(data, index);
110+
var value = bitConverter.ToSingle(data, index);
106111

107112
if (!matcher(value))
108113
{

ReClass.NET/MemoryScanner/Comparer/IntegerMemoryComparer.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Diagnostics;
3+
using ReClassNET.Util.Conversion;
34

45
namespace ReClassNET.MemoryScanner.Comparer
56
{
@@ -10,12 +11,16 @@ public class IntegerMemoryComparer : ISimpleScanComparer
1011
public int Value2 { get; }
1112
public int ValueSize => sizeof(int);
1213

13-
public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2)
14+
private readonly EndianBitConverter bitConverter;
15+
16+
public IntegerMemoryComparer(ScanCompareType compareType, int value1, int value2, EndianBitConverter bitConverter)
1417
{
1518
CompareType = compareType;
1619

1720
Value1 = value1;
1821
Value2 = value2;
22+
23+
this.bitConverter = bitConverter;
1924
}
2025

2126
public bool Compare(byte[] data, int index, out ScanResult result)
@@ -76,11 +81,11 @@ out result
7681
);
7782
}
7883

79-
private static bool CompareInternal(byte[] data, int index, Func<int, bool> matcher, out ScanResult result)
84+
private bool CompareInternal(byte[] data, int index, Func<int, bool> matcher, out ScanResult result)
8085
{
8186
result = null;
8287

83-
var value = BitConverter.ToInt32(data, index);
88+
var value = bitConverter.ToInt32(data, index);
8489

8590
if (!matcher(value))
8691
{

0 commit comments

Comments
 (0)