返回提交历史
Modified
README.md
+62
-1
Modified
XFEExtension.NetCore.MemoryEditor/DynamicMemoryListener.cs
+1
-1
Modified
XFEExtension.NetCore.MemoryEditor/Manager/MemoryItem.cs
+1
-1
Modified
XFEExtension.NetCore.MemoryEditor/Manager/MemoryListenerManager.cs
+6
-12
Modified
XFEExtension.NetCore.MemoryEditor/Manager/MemoryManagerBuilder.cs
+7
-3
Modified
XFEExtension.NetCore.MemoryEditor/Manager/UpdatableMemoryItem.cs
+27
-2
Modified
XFEExtension.NetCore.MemoryEditor/MemoryListener.cs
+2
-1
Modified
XFEExtension.NetCore.MemoryEditor/StaticMemoryListener.cs
+1
-1
Modified
XFEExtension.NetCore.MemoryEditor/UpdatableMemoryListener.cs
+24
-3
Modified
XFEExtension.NetCore.MemoryEditor/XFEExtension.NetCore.MemoryEditor.csproj
+4
-3
XFEstudio/XFEExtension.NetCore.MemoryEditor
优化部分构建器 添加md文档
f4e7fe9
代码差异
10 个文件
+135
-28
@@ -1 +1,62 @@
1
# XFEExtension.NetCore.MemoryEditor
1
# XFEExtension.NetCore.MemoryEditor
2
3
## �����ڴ������
4
```csharp
5
public static class Program
6
{
7
public static UpdatableMemoryManager Manager { get; } = MemoryManager.CreateBuilder() //�����ڴ�������Ĺ�����
8
.WithAutoReacquireProcess("ExampleGame") //��Ŀ������˳����Զ����»�ȡĿ�����ƵĽ���
9
.WithFindProcessWhenCreate() //����������ʱ����ʼѰ��Ŀ�����ƵĽ��̣����ǰ��������Ŀ��������ƴ˴����Բ������ã�
10
.BuildUpdatableManager(
11
MemoryItemBuilder.Create<int>("Level") //Ϊÿ����ַ����һ������
12
.WithResolvePointer("xxx-xxx-xx.dll", 0x0072A200, 0x14A0, 0x0, 0x80, 0xE4, 0x0, 0x1EC) //�ڴ��ַ��ģ�����ơ���ַ��ƫ�Ʋ���
13
.WithListener(), //���Ӽ�����
14
MemoryItemBuilder.Create<float>("HealthPoint")
15
.WithResolvePointer("xxx-xxx-xx.dll", 0x0072A200, 0x12E8, 0x0, 0x80, 0xE4, 0x0, 0x1E0)
16
.WithListener(),
17
MemoryItemBuilder.Create<float>("Stamina")
18
.WithResolvePointer("xxx-xxx-xx.dll", 0x0072A200, 0x14E0, 0x48, 0x10, 0x20, 0x50, 0x20, 0x1B0)
19
.WithListener());
20
//�Ƽ�ʹ�ÿɸ����ڴ������
21
}
22
23
public partial class MainForm : Form
24
{
25
public MainForm()
26
{
27
InitializeComponent();
28
Program.Manager.ValueChanged += Manager_ValueChanged;//�����ڴ�ֵ�ı��¼�
29
}
30
31
private void Manager_ValueChanged(XFEExtension.NetCore.MemoryEditor.Manager.MemoryItem sender, MemoryValue e)
32
{
33
Trace.WriteLine($"���ƣ�{e.CustomName} ��ַ��{sender:X}\t�Ƿ��ȡ��ֵ �ϴΣ�{e.PreviousValueGetSuccessful} ��Σ�{e.CurrentValueGetSuccessful} ֵ�ӣ�{e.PreviousValue} ���Ϊ��{e.CurrentValue}");
34
switch (e.CustomName)
35
{
36
case "Level":
37
if (e.CurrentValueGetSuccessful)
38
{
39
if (!sender.Write(��д��ֵ))
40
Trace.WriteLine($"Level��д��ʧ��");
41
}
42
break;
43
case "HealthPoint":
44
if (e.CurrentValueGetSuccessful)
45
{
46
if (!sender.Write(��д��ֵ))
47
Trace.WriteLine("HealthPoint��д��ʧ��");
48
}
49
break;
50
case "Stamina":
51
if (e.CurrentValueGetSuccessful)
52
{
53
if (!sender.Write(��д��ֵ))
54
Trace.WriteLine("Stamina��д��ʧ��");
55
}
56
break;
57
default:
58
break;
59
}
60
}
61
}
62
```
@@ -48,7 +48,7 @@ public abstract class DynamicMemoryListener(string customName, Func<nint?> getAd
48
48
}
49
49
}
50
50
var currentValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress!.Value, memoryAddressType);
51
if (lastValue is null == currentValue is null || lastValue?.Equals(currentValue) == false)
51
if (lastValue is null != currentValue is null || lastValue?.Equals(currentValue) == false)
52
52
{
53
53
valueChanged?.Invoke(this, new(lastValue is not null, currentValue is not null, lastValue, currentValue, name));
54
54
lastValue = currentValue;
@@ -71,7 +71,7 @@ public abstract class MemoryItem(string name, Type memoryItemType, MemoryEditor
71
71
/// <returns>返回结果</returns>
72
72
public T Read<T>() where T : struct
73
73
{
74
Read<T>(out T result);
74
Read(out T result);
75
75
return result;
76
76
}
77
77
/// <summary>
@@ -49,6 +49,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
49
49
{
50
50
currentProcess?.Dispose();
51
51
currentProcess = value;
52
value.EnableRaisingEvents = true;
52
53
ProcessName = value.ProcessName;
53
54
ProcessHandler = MemoryEditor.GetProcessHandle(value.Id, ProcessAccessFlags);
54
55
currentProcess.Exited += CurrentProcess_Exited;
@@ -107,6 +108,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
107
108
if (!IsListening)
108
109
IsListening = true;
109
110
var staticMemoryListener = MemoryListener.CreateStaticListener(customName, memoryAddress, type);
111
listenerDictionary.Add(customName, staticMemoryListener);
110
112
staticMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
111
113
if (startListen)
112
114
_ = staticMemoryListener.StartListen(ProcessHandler, frequency);
@@ -117,6 +119,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
117
119
if (!IsListening)
118
120
IsListening = true;
119
121
var dynamicMemoryListener = MemoryListener.CreateDynamicListener(customName, memoryAddressGetFunc, type);
122
listenerDictionary.Add(customName, dynamicMemoryListener);
120
123
dynamicMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
121
124
if (startListen)
122
125
_ = dynamicMemoryListener.StartListen(ProcessHandler, frequency);
@@ -127,6 +130,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
127
130
if (!IsListening)
128
131
IsListening = true;
129
132
var updatableMemoryListener = MemoryListener.CreateUpdatableListener(customName, memoryAddressUpdateFunc, type);
133
listenerDictionary.Add(customName, updatableMemoryListener);
130
134
updatableMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
131
135
if (startListen)
132
136
_ = updatableMemoryListener.StartListen(ProcessHandler, frequency);
@@ -160,7 +164,6 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
160
164
/// <inheritdoc/>
161
165
public override async Task StopListeners()
162
166
{
163
IsListening = false;
164
167
var taskList = new List<Task>();
165
168
foreach (var listener in listenerDictionary.Values)
166
169
{
@@ -171,18 +174,9 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
171
174
/// <inheritdoc/>
172
175
public override async Task StopListener(string customName) => await listenerDictionary[customName].StopListen();
173
176
/// <inheritdoc/>
174
public override void RemoveListener(string customName)
175
{
176
listenerDictionary.Remove(customName);
177
if (listenerDictionary.Count == 0)
178
IsListening = false;
179
}
177
public override void RemoveListener(string customName) => listenerDictionary.Remove(customName);
180
178
/// <inheritdoc/>
181
public override void ClearListeners()
182
{
183
IsListening = false;
184
listenerDictionary.Clear();
185
}
179
public override void ClearListeners() => listenerDictionary.Clear();
186
180
/// <summary>
187
181
/// 内存监听器
188
182
/// </summary>
@@ -32,10 +32,13 @@ public abstract class MemoryManagerBuilder()
32
32
/// <summary>
33
33
/// 使用自动重新获取进程
34
34
/// </summary>
35
/// <param name="processName">进程名称</param>
35
36
/// <param name="reacquireProcessFrequency">重新获取进程的检测频率(单位毫秒)</param>
36
37
/// <returns></returns>
37
public MemoryManagerBuilder WithAutoReacquireProcess(int reacquireProcessFrequency = 500)
38
public MemoryManagerBuilder WithAutoReacquireProcess(string processName = "", int reacquireProcessFrequency = 500)
38
39
{
40
if (processName != string.Empty)
41
ProcessName = processName;
39
42
AutoReacquireProcess = true;
40
43
ReacquireProcessFrequency = reacquireProcessFrequency;
41
44
return this;
@@ -45,9 +48,10 @@ public abstract class MemoryManagerBuilder()
45
48
/// </summary>
46
49
/// <param name="processName">进程名称</param>
47
50
/// <returns></returns>
48
public MemoryManagerBuilder WithFindProcessWhenCreate(string processName)
51
public MemoryManagerBuilder WithFindProcessWhenCreate(string processName = "")
49
52
{
50
ProcessName = processName;
53
if (processName != string.Empty)
54
ProcessName = processName;
51
55
FindProcessWhenCreate = true;
52
56
return this;
53
57
}
@@ -1,4 +1,6 @@
1
using XFEExtension.NetCore.ImplExtension;
1
using System.Diagnostics;
2
using XFEExtension.NetCore.DelegateExtension;
3
using XFEExtension.NetCore.ImplExtension;
2
4
3
5
namespace XFEExtension.NetCore.MemoryEditor.Manager;
4
6
@@ -12,10 +14,33 @@ namespace XFEExtension.NetCore.MemoryEditor.Manager;
12
14
[CreateImpl]
13
15
public abstract class UpdatableMemoryItem(string name, Func<nint?> memoryAddressUpdateFunc, Type memoryItemType, MemoryEditor memoryEditor) : MemoryItem(name, memoryItemType, memoryEditor)
14
16
{
17
private UpdatableMemoryListener? listener;
15
18
/// <summary>
16
19
/// 监听器
17
20
/// </summary>
18
public UpdatableMemoryListener? Listener { get; protected set; }
21
public UpdatableMemoryListener? Listener
22
{
23
get => listener;
24
protected set
25
{
26
listener = value;
27
if (listener is not null)
28
{
29
listener.MemoryAddressUpdated += Listener_MemoryAddressUpdated;
30
MemoryAddress = listener.MemoryAddress;
31
}
32
}
33
}
34
/// <summary>
35
/// 地址更新时触发
36
/// </summary>
37
public event XFEEventHandler<UpdatableMemoryListener, nint>? MemoryAddressUpdated;
38
private void Listener_MemoryAddressUpdated(UpdatableMemoryListener sender, nint e)
39
{
40
if (MemoryAddress != e)
41
MemoryAddress = e;
42
MemoryAddressUpdated?.Invoke(sender, e);
43
}
19
44
/// <summary>
20
45
/// 内存地址更新方法
21
46
/// </summary>
@@ -1,4 +1,5 @@
1
using XFEExtension.NetCore.DelegateExtension;
1
using System.Diagnostics;
2
using XFEExtension.NetCore.DelegateExtension;
2
3
3
4
namespace XFEExtension.NetCore.MemoryEditor;
4
5
@@ -38,7 +38,7 @@ public abstract class StaticMemoryListener(string customName, nint memoryAddress
38
38
try
39
39
{
40
40
var currentValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType);
41
if (lastValue is null == currentValue is null || lastValue?.Equals(currentValue) == false)
41
if (lastValue is null != currentValue is null || lastValue?.Equals(currentValue) == false)
42
42
{
43
43
valueChanged?.Invoke(this, new(lastValue is not null, currentValue is not null, lastValue, currentValue, name));
44
44
lastValue = currentValue;
@@ -1,4 +1,6 @@
1
using XFEExtension.NetCore.ImplExtension;
1
using System.Diagnostics;
2
using XFEExtension.NetCore.DelegateExtension;
3
using XFEExtension.NetCore.ImplExtension;
2
4
3
5
namespace XFEExtension.NetCore.MemoryEditor;
4
6
@@ -13,6 +15,10 @@ public abstract class UpdatableMemoryListener(string customName, Func<nint?> upd
13
15
{
14
16
private nint memoryAddress = updateAddressFunc.Invoke() ?? default;
15
17
/// <summary>
18
/// 地址更新时触发
19
/// </summary>
20
public event XFEEventHandler<UpdatableMemoryListener, nint>? MemoryAddressUpdated;
21
/// <summary>
16
22
/// 内存地址
17
23
/// </summary>
18
24
public nint MemoryAddress
@@ -37,13 +43,27 @@ public abstract class UpdatableMemoryListener(string customName, Func<nint?> upd
37
43
CurrentListeningTask = Task.Run(async () =>
38
44
{
39
45
object? lastValue = null;
40
try { lastValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType); } catch { }
46
if (memoryAddress != 0)
47
try { lastValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType); } catch { }
41
48
while (isListening)
42
49
{
43
50
try
44
51
{
52
if (memoryAddress == 0)
53
{
54
if (lastValue is not null)
55
{
56
valueChanged?.Invoke(this, new(lastValue is not null, false, lastValue, null, name));
57
lastValue = null;
58
}
59
while (memoryAddress == 0 && isListening)
60
{
61
UpdateAddress();
62
await Task.Delay(this.frequency);
63
}
64
}
45
65
var currentValue = MemoryEditor.ReadMemory(this.processHandler, memoryAddress, memoryAddressType);
46
if (lastValue is null == currentValue is null || lastValue?.Equals(currentValue) == false)
66
if (lastValue is null != currentValue is null || lastValue?.Equals(currentValue) == false)
47
67
{
48
68
valueChanged?.Invoke(this, new(lastValue is not null, currentValue is not null, lastValue, currentValue, name));
49
69
lastValue = currentValue;
@@ -66,5 +86,6 @@ public abstract class UpdatableMemoryListener(string customName, Func<nint?> upd
66
86
ProcessHandler = processHandler;
67
87
}
68
88
memoryAddress = updateAddressFunc.Invoke() ?? memoryAddress;
89
MemoryAddressUpdated?.Invoke(this, memoryAddress);
69
90
}
70
91
}
@@ -8,18 +8,19 @@
8
8
<Title>XFEExtension.NetCore.MemoryEditor</Title>
9
9
<Authors>XFEstudio</Authors>
10
10
<Company>寰宇朽力网络科技</Company>
11
<Description>内存读写工具</Description>
11
<Description>内存读写工具,支持使用基址,内置内存管理器</Description>
12
12
<PackageIcon>logoIcon.png</PackageIcon>
13
13
<PackageReadmeFile>README.md</PackageReadmeFile>
14
14
<RepositoryUrl>https://github.com/XFEstudio/XFEExtension.NetCore.MemoryEditor.git</RepositoryUrl>
15
15
<PackageTags>XFE;XFEExtension;MemoryEdit;Memory</PackageTags>
16
<PackageReleaseNotes>大幅度优化结构,完善监听器</PackageReleaseNotes>
16
<PackageReleaseNotes>新增内存管理器
17
整体框架大幅更改</PackageReleaseNotes>
17
18
<Copyright>寰宇朽力网络科技版权所有</Copyright>
18
19
<PackageProjectUrl>https://github.com/XFEstudio/XFEExtension.NetCore.MemoryEditor.git</PackageProjectUrl>
19
20
<GenerateDocumentationFile>True</GenerateDocumentationFile>
20
21
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
21
22
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
22
<Version>1.4.0</Version>
23
<Version>2.0.0</Version>
23
24
</PropertyGroup>
24
25
25
26
<ItemGroup>