XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.MemoryEditor

【DLL】内存读写工具/编辑器

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEExtension.NetCore.MemoryEditor

撤销对抽象类的取消,现在统一使用优化后的构建器 优化内存条目构建器,现在可以直接添加基址指针动态表达式

ff62546
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

10 个文件 +284 -62
Modified XFEExtension.NetCore.MemoryEditor.sln +14 -7
@@ -2,9 +2,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
2 2 # Visual Studio Version 17
3 3 VisualStudioVersion = 17.9.34728.123
4 4 MinimumVisualStudioVersion = 10.0.40219.1
5 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XFEExtension.NetCore.MemoryEditor", "..\..\..\..\..\..\Desktop\work\C#\GitHub\XFEstudio\XFEExtension.NetCore.MemoryEditor\XFEExtension.NetCore.MemoryEditor\XFEExtension.NetCore.MemoryEditor.csproj", "{DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}"
6 EndProject
7 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SeaOfRadiationEditor", "..\..\..\..\..\..\Desktop\work\C#\GitHub\XFEstudio\SeaOfRadiationEditor\SeaOfRadiationEditor\SeaOfRadiationEditor.csproj", "{7D09E8EC-562E-496F-8362-5BEBD541238D}"
5 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "XFEExtension.NetCore.MemoryEditor", "XFEExtension.NetCore.MemoryEditor\XFEExtension.NetCore.MemoryEditor.csproj", "{DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}"
8 6 EndProject
9 7 Global
10 8 GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -12,10 +10,19 @@ Global
12 10 Release|Any CPU = Release|Any CPU
13 11 EndGlobalSection
14 12 GlobalSection(ProjectConfigurationPlatforms) = postSolution
15 {7D09E8EC-562E-496F-8362-5BEBD541238D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
16 {7D09E8EC-562E-496F-8362-5BEBD541238D}.Debug|Any CPU.Build.0 = Debug|Any CPU
17 {7D09E8EC-562E-496F-8362-5BEBD541238D}.Release|Any CPU.ActiveCfg = Release|Any CPU
18 {7D09E8EC-562E-496F-8362-5BEBD541238D}.Release|Any CPU.Build.0 = Release|Any CPU
13 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
14 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Debug|Any CPU.Build.0 = Debug|Any CPU
15 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Release|Any CPU.ActiveCfg = Release|Any CPU
16 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Release|Any CPU.Build.0 = Release|Any CPU
17 EndGlobalSection
18 GlobalSection(SolutionProperties) = preSolution
19 HideSolutionNode = FALSE
20 EndGlobalSection
21 GlobalSection(ExtensibilityGlobals) = postSolution
22 SolutionGuid = {5652406C-CF19-4708-BA94-E51808552081}
23 EndGlobalSection
24 EndGlobal
25 {7D09E8EC-562E-496F-8362-5BEBD541238D}.Release|Any CPU.Build.0 = Release|Any CPU
19 26 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
20 27 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Debug|Any CPU.Build.0 = Debug|Any CPU
21 28 {DBFE2E7A-C727-4E8D-AD9E-83E7EA36F937}.Release|Any CPU.ActiveCfg = Release|Any CPU
Modified XFEExtension.NetCore.MemoryEditor/Manager/DynamicMemoryManager.cs +15 -4
@@ -1,11 +1,13 @@
1 1 using System.Collections;
2 using XFEExtension.NetCore.ImplExtension;
2 3
3 4 namespace XFEExtension.NetCore.MemoryEditor.Manager;
4 5
5 6 /// <summary>
6 7 /// 动态内存管理器
7 8 /// </summary>
8 public class DynamicMemoryManager : MemoryManager
9 [CreateImpl]
10 public abstract class DynamicMemoryManager : MemoryManager
9 11 {
10 12 /// <summary>
11 13 /// 地址值字典
@@ -19,8 +21,17 @@ public class DynamicMemoryManager : MemoryManager
19 21 public DynamicMemoryItem this[string addressName] => ItemDictionary[addressName];
20 22 internal override void Add(MemoryItemBuilder builder)
21 23 {
22 if (builder.DynamicMemoryAddress is null)
23 throw new ArgumentNullException(nameof(builder), "对于动态地址管理器,构建器的动态地址不可为空");
24 if (builder.UseResolvePointer)
25 {
26 if (builder.ModuleName is null)
27 throw new ArgumentNullException(nameof(builder), "对于使用基址指针表达式的构建器,模块名称是必须的");
28 builder.DynamicMemoryAddress = new(() => Editor.ResolvePointerAddress(builder.ModuleName, builder.BaseAddress, builder.Offsets));
29 }
30 else
31 {
32 if (builder.DynamicMemoryAddress is null)
33 throw new ArgumentNullException(nameof(builder), "对于动态地址管理器,构建器的动态地址不可为空");
34 }
24 35 var dynamicMemoryItem = new DynamicMemoryItemImpl(builder.Name, builder.DynamicMemoryAddress, builder.MemoryAddressType, Editor);
25 36 if (builder.HasListener)
26 37 dynamicMemoryItem.AddListener(builder.ListenerFrequency, builder.StartListen);
@@ -40,5 +51,5 @@ public class DynamicMemoryManager : MemoryManager
40 51 /// 动态内存管理器
41 52 /// </summary>
42 53 /// <param name="builders">内存构建器组</param>
43 public DynamicMemoryManager(params MemoryItemBuilder[] builders) => Add(builders);
54 internal DynamicMemoryManager(params MemoryItemBuilder[] builders) => Add(builders);
44 55 }
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryItem.cs +1 -1
@@ -40,7 +40,7 @@ public abstract class MemoryItem(string name, Type memoryItemType, MemoryEditor
40 40 if (IsListening)
41 41 throw new InvalidOperationException("正在监听中,无法重复监听");
42 42 IsListening = true;
43 await StartListen(memoryEditor.ProcessHandle, frequency);
43 await StartListen(memoryEditor.ProcessHandler, frequency);
44 44 }
45 45 internal abstract Task StartListen(nint processHandler, TimeSpan? frequency);
46 46 /// <summary>
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryItemBuilder.cs +31 -0
@@ -21,6 +21,10 @@ public abstract class MemoryItemBuilder
21 21 /// </summary>
22 22 public bool StartListen { get; set; }
23 23 /// <summary>
24 /// 使用基址指针表达式
25 /// </summary>
26 public bool UseResolvePointer { get; private set; }
27 /// <summary>
24 28 /// 内存地址类型
25 29 /// </summary>
26 30 public required Type MemoryAddressType { get; set; }
@@ -41,6 +45,18 @@ public abstract class MemoryItemBuilder
41 45 /// </summary>
42 46 public Func<nint?>? UpdatableMemoryAddress { get; set; }
43 47 /// <summary>
48 /// 模块名称
49 /// </summary>
50 public string? ModuleName { get; set; }
51 /// <summary>
52 /// 模块的地址部分
53 /// </summary>
54 public nint BaseAddress { get; set; }
55 /// <summary>
56 /// 基址偏移部分
57 /// </summary>
58 public nint[] Offsets { get; set; } = [];
59 /// <summary>
44 60 /// 为该地址添加监听器
45 61 /// </summary>
46 62 /// <param name="frequency">监听频率</param>
@@ -87,6 +103,21 @@ public abstract class MemoryItemBuilder
87 103 return this;
88 104 }
89 105 /// <summary>
106 /// 使用基址指针动态表达式
107 /// </summary>
108 /// <param name="moduleName">模块名称</param>
109 /// <param name="baseAddress">模块的地址部分</param>
110 /// <param name="offsets">基址指针偏移部分</param>
111 /// <returns></returns>
112 public MemoryItemBuilder WithResolvePointer(string moduleName, nint baseAddress, params nint[] offsets)
113 {
114 UseResolvePointer = true;
115 ModuleName = moduleName;
116 BaseAddress = baseAddress;
117 Offsets = offsets;
118 return this;
119 }
120 /// <summary>
90 121 /// 使用可更新内存地址
91 122 /// </summary>
92 123 /// <param name="memoryAddressUpdateFunc">内存地址更新方法</param>
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryListenerManager.cs +32 -16
@@ -73,19 +73,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
73 73 {
74 74 CurrentProcessExit?.Invoke(sender, e);
75 75 if (AutoReacquireProcess)
76 _ = Task.Run(async () =>
77 {
78 while (currentProcess is null || currentProcess.HasExited)
79 {
80 var result = Process.GetProcessesByName(ProcessName);
81 if (result is not null && result.Length >= 1)
82 {
83 CurrentProcess = result[0];
84 return;
85 }
86 await Task.Delay(AutoReacquireProcessFrequency);
87 }
88 });
76 _ = WaitProcessEnter();
89 77 await StopListeners();
90 78 }
91 79 /// <summary>
@@ -97,9 +85,9 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
97 85 /// </summary>
98 86 public bool AutoReacquireProcess { get; set; }
99 87 /// <summary>
100 /// 自动重新获取进程的检测频率(单位毫秒)
88 /// 重新获取进程的检测频率(单位毫秒)
101 89 /// </summary>
102 public int AutoReacquireProcessFrequency { get; set; } = 500;
90 public int ReacquireProcessFrequency { get; set; } = 500;
103 91 /// <summary>
104 92 /// 进程句柄权限
105 93 /// </summary>
@@ -119,6 +107,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
119 107 if (!IsListening)
120 108 IsListening = true;
121 109 var staticMemoryListener = MemoryListener.CreateStaticListener(customName, memoryAddress, type);
110 staticMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
122 111 if (startListen)
123 112 _ = staticMemoryListener.StartListen(ProcessHandler, frequency);
124 113 return staticMemoryListener;
@@ -128,6 +117,7 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
128 117 if (!IsListening)
129 118 IsListening = true;
130 119 var dynamicMemoryListener = MemoryListener.CreateDynamicListener(customName, memoryAddressGetFunc, type);
120 dynamicMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
131 121 if (startListen)
132 122 _ = dynamicMemoryListener.StartListen(ProcessHandler, frequency);
133 123 return dynamicMemoryListener;
@@ -137,10 +127,36 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
137 127 if (!IsListening)
138 128 IsListening = true;
139 129 var updatableMemoryListener = MemoryListener.CreateUpdatableListener(customName, memoryAddressUpdateFunc, type);
130 updatableMemoryListener.ValueChanged += (sender, e) => ValueChanged?.Invoke(sender, e);
140 131 if (startListen)
141 132 _ = updatableMemoryListener.StartListen(ProcessHandler, frequency);
142 133 return updatableMemoryListener;
143 134 }
135 /// <summary>
136 /// 等待目标进程出现
137 /// </summary>
138 /// <param name="processName">进程名称</param>
139 /// <param name="frequency">检测频率</param>
140 /// <returns></returns>
141 public async Task WaitProcessEnter(string? processName = null, int frequency = 500)
142 {
143 if (processName is not null)
144 ProcessName = processName;
145 ReacquireProcessFrequency = frequency;
146 await Task.Run(async () =>
147 {
148 while (currentProcess is null || currentProcess.HasExited)
149 {
150 var result = Process.GetProcessesByName(ProcessName);
151 if (result is not null && result.Length >= 1)
152 {
153 CurrentProcess = result[0];
154 return;
155 }
156 await Task.Delay(ReacquireProcessFrequency);
157 }
158 });
159 }
144 160 /// <inheritdoc/>
145 161 public override async Task StopListeners()
146 162 {
@@ -217,4 +233,4 @@ public class MemoryListenerManager : MemoryListenerManagerBase, IDisposable, IEn
217 233 /// </summary>
218 234 /// <returns></returns>
219 235 public IEnumerator GetEnumerator() => listenerDictionary.GetEnumerator();
220 }
236 }
Modified XFEExtension.NetCore.MemoryEditor/Manager/MemoryManager.cs +53 -4
@@ -1,5 +1,6 @@
1 1 using System.Collections;
2 2 using System.Diagnostics;
3 using XFEExtension.NetCore.DelegateExtension;
3 4
4 5 namespace XFEExtension.NetCore.MemoryEditor.Manager;
5 6
@@ -10,18 +11,53 @@ public abstract class MemoryManager : IMemoryManager
10 11 {
11 12 private protected bool disposedValue;
12 13 /// <summary>
13 /// 编辑器
14 /// 当指定地址的内存值变化时触发
14 15 /// </summary>
15 public MemoryEditor Editor { get; protected set; } = new();
16 public event XFEEventHandler<MemoryItem, MemoryValue>? ValueChanged;
17 /// <summary>
18 /// 当前进程结束时触发
19 /// </summary>
20 public event EventHandler? CurrentProcessExit;
16 21 /// <summary>
17 /// 现成句柄
22 /// 目标进程启动时触发
18 23 /// </summary>
19 public nint ProcessHandler { get => Editor.ProcessHandle; set => Editor.ProcessHandle = value; }
24 public event EventHandler? CurrentProcessEntered;
20 25 /// <summary>
21 26 /// 当前目标进程
22 27 /// </summary>
23 28 public Process? CurrentProcess { get => Editor.CurrentProcess; set => Editor.CurrentProcess = value; }
24 29 /// <summary>
30 /// 进程句柄
31 /// </summary>
32 public nint ProcessHandler { get => Editor.ProcessHandler; set => Editor.ProcessHandler = value; }
33 /// <summary>
34 /// 当目标进程退出后,是否自动重新获取进程
35 /// </summary>
36 public bool AutoReacquireProcess { get => Editor.AutoReacquireProcess; set => Editor.AutoReacquireProcess = value; }
37 /// <summary>
38 /// 重新获取进程的检测频率(单位毫秒)
39 /// </summary>
40 public int ReacquireProcessFrequency { get => Editor.AutoReacquireProcessFrequency; set => Editor.AutoReacquireProcessFrequency = value; }
41 /// <summary>
42 /// 进程句柄权限(不懂勿填)
43 /// </summary>
44 public ProcessAccessFlags ProcessAccessFlags { get => Editor.ProcessAccessFlags; set => Editor.ProcessAccessFlags = value; }
45 /// <summary>
46 /// 进程位数类型(32/64)
47 /// </summary>
48 public ProcessType ProcessBiteType { get => Editor.ProcessBiteType; set => Editor.ProcessBiteType = value; }
49 /// <summary>
50 /// 编辑器
51 /// </summary>
52 public MemoryEditor Editor { get; protected set; } = new();
53 /// <summary>
54 /// 等待目标进程出现
55 /// </summary>
56 /// <param name="processName">进程名称</param>
57 /// <param name="frequency">检测频率</param>
58 /// <returns></returns>
59 public async Task WaitProcessEnter(string? processName = null, int frequency = 500) => await Editor.WaitProcessEnter(processName, frequency);
60 /// <summary>
25 61 /// 移除指定名称的地址
26 62 /// </summary>
27 63 /// <param name="addressName">地址名称</param>
@@ -64,4 +100,17 @@ public abstract class MemoryManager : IMemoryManager
64 100 /// </summary>
65 101 /// <returns></returns>
66 102 public abstract IEnumerator GetEnumerator();
103 /// <summary>
104 /// 内存管理器
105 /// </summary>
106 protected MemoryManager()
107 {
108 Editor.CurrentProcessEntered += (sender, e) => CurrentProcessEntered?.Invoke(sender, e);
109 Editor.CurrentProcessExit += (sender, e) => CurrentProcessExit?.Invoke(sender, e);
110 }
111 /// <summary>
112 /// 创建内存管理器构建器
113 /// </summary>
114 /// <returns></returns>
115 public static MemoryManagerBuilder CreateBuilder() => MemoryManagerBuilder.CreateBuilder();
67 116 }
Added XFEExtension.NetCore.MemoryEditor/Manager/MemoryManagerBuilder.cs +102 -0
@@ -0,0 +1,102 @@
1 using XFEExtension.NetCore.ImplExtension;
2
3 namespace XFEExtension.NetCore.MemoryEditor.Manager;
4
5 /// <summary>
6 /// 内存管理器构建器
7 /// </summary>
8 [CreateImpl]
9 public abstract class MemoryManagerBuilder()
10 {
11 /// <summary>
12 /// 进程名称
13 /// </summary>
14 public string ProcessName { get; set; } = string.Empty;
15 /// <summary>
16 /// 当目标进程退出后,是否自动重新获取进程
17 /// </summary>
18 public bool AutoReacquireProcess { get; set; }
19 /// <summary>
20 /// 重新获取进程的检测频率(单位毫秒)
21 /// </summary>
22 public int ReacquireProcessFrequency { get; set; }
23 /// <summary>
24 /// 是否在创建后自动开始寻找目标进程
25 /// </summary>
26 public bool FindProcessWhenCreate { get; set; }
27 /// <summary>
28 /// 创建内存地址管理器构建器
29 /// </summary>
30 /// <returns></returns>
31 public static MemoryManagerBuilder CreateBuilder() => new MemoryManagerBuilderImpl();
32 /// <summary>
33 /// 使用自动重新获取进程
34 /// </summary>
35 /// <param name="reacquireProcessFrequency">重新获取进程的检测频率(单位毫秒)</param>
36 /// <returns></returns>
37 public MemoryManagerBuilder WithAutoReacquireProcess(int reacquireProcessFrequency = 500)
38 {
39 AutoReacquireProcess = true;
40 ReacquireProcessFrequency = reacquireProcessFrequency;
41 return this;
42 }
43 /// <summary>
44 /// 在创建后自动开始寻找目标进程
45 /// </summary>
46 /// <param name="processName">进程名称</param>
47 /// <returns></returns>
48 public MemoryManagerBuilder WithFindProcessWhenCreate(string processName)
49 {
50 ProcessName = processName;
51 FindProcessWhenCreate = true;
52 return this;
53 }
54 /// <summary>
55 /// 构建静态内存地址管理器
56 /// </summary>
57 /// <param name="builders">内存构建器组</param>
58 /// <returns></returns>
59 public StaticMemoryManager BuildStaticManager(params MemoryItemBuilder[] builders)
60 {
61 var manager = new StaticMemoryManagerImpl(builders)
62 {
63 AutoReacquireProcess = AutoReacquireProcess,
64 ReacquireProcessFrequency = ReacquireProcessFrequency
65 };
66 if (FindProcessWhenCreate)
67 _ = manager.WaitProcessEnter(ProcessName);
68 return manager;
69 }
70 /// <summary>
71 /// 构建动态内存地址管理器
72 /// </summary>
73 /// <param name="builders">内存构建器组</param>
74 /// <returns></returns>
75 public DynamicMemoryManager BuildDynamicManager(params MemoryItemBuilder[] builders)
76 {
77 var manager = new DynamicMemoryManagerImpl(builders)
78 {
79 AutoReacquireProcess = AutoReacquireProcess,
80 ReacquireProcessFrequency = ReacquireProcessFrequency
81 };
82 if (FindProcessWhenCreate)
83 _ = manager.WaitProcessEnter(ProcessName);
84 return manager;
85 }
86 /// <summary>
87 /// 构建可更新内存地址管理器
88 /// </summary>
89 /// <param name="builders">内存构建器组</param>
90 /// <returns></returns>
91 public UpdatableMemoryManager BuildUpdatableManager(params MemoryItemBuilder[] builders)
92 {
93 var manager = new UpdatableMemoryManager(builders)
94 {
95 AutoReacquireProcess = AutoReacquireProcess,
96 ReacquireProcessFrequency = ReacquireProcessFrequency
97 };
98 if (FindProcessWhenCreate)
99 _ = manager.WaitProcessEnter(ProcessName);
100 return manager;
101 }
102 }
Modified XFEExtension.NetCore.MemoryEditor/Manager/StaticMemoryManager.cs +3 -1
@@ -1,10 +1,12 @@
1 1 using System.Collections;
2 using XFEExtension.NetCore.ImplExtension;
2 3
3 4 namespace XFEExtension.NetCore.MemoryEditor.Manager;
4 5
5 6 /// <summary>
6 7 /// 静态内存管理器
7 8 /// </summary>
9 [CreateImpl]
8 10 public class StaticMemoryManager : MemoryManager
9 11 {
10 12 /// <summary>
@@ -40,5 +42,5 @@ public class StaticMemoryManager : MemoryManager
40 42 /// 静态内存管理器
41 43 /// </summary>
42 44 /// <param name="builders">内存构建器组</param>
43 public StaticMemoryManager(params MemoryItemBuilder[] builders) => Add(builders);
45 internal StaticMemoryManager(params MemoryItemBuilder[] builders) => Add(builders);
44 46 }
Modified XFEExtension.NetCore.MemoryEditor/Manager/UpdatableMemoryManager.cs +14 -3
@@ -1,10 +1,12 @@
1 1 using System.Collections;
2 using XFEExtension.NetCore.ImplExtension;
2 3
3 4 namespace XFEExtension.NetCore.MemoryEditor.Manager;
4 5
5 6 /// <summary>
6 7 /// 可更新内存管理器
7 8 /// </summary>
9 [CreateImpl]
8 10 public class UpdatableMemoryManager : MemoryManager
9 11 {
10 12 /// <summary>
@@ -19,8 +21,17 @@ public class UpdatableMemoryManager : MemoryManager
19 21 public UpdatableMemoryItem this[string addressName] => ItemDictionary[addressName];
20 22 internal override void Add(MemoryItemBuilder builder)
21 23 {
22 if (builder.UpdatableMemoryAddress is null)
23 throw new ArgumentNullException(nameof(builder), "对于可更新内存管理器,构建器更新地址的方法不可为空");
24 if (builder.UseResolvePointer)
25 {
26 if (builder.ModuleName is null)
27 throw new ArgumentNullException(nameof(builder), "对于使用基址指针表达式的构建器,模块名称是必须的");
28 builder.UpdatableMemoryAddress = new(() => Editor.ResolvePointerAddress(builder.ModuleName, builder.BaseAddress, builder.Offsets));
29 }
30 else
31 {
32 if (builder.UpdatableMemoryAddress is null)
33 throw new ArgumentNullException(nameof(builder), "对于可更新内存管理器,构建器更新地址的方法不可为空");
34 }
24 35 var updatableMemoryItem = new UpdatableMemoryItemImpl(builder.Name, builder.UpdatableMemoryAddress, builder.MemoryAddressType, Editor);
25 36 if (builder.HasListener)
26 37 updatableMemoryItem.AddListener(builder.ListenerFrequency, builder.StartListen);
@@ -40,5 +51,5 @@ public class UpdatableMemoryManager : MemoryManager
40 51 /// 可更新内存管理器
41 52 /// </summary>
42 53 /// <param name="builders">内存构建器组</param>
43 public UpdatableMemoryManager(params MemoryItemBuilder[] builders) => Add(builders);
54 internal UpdatableMemoryManager(params MemoryItemBuilder[] builders) => Add(builders);
44 55 }
Modified XFEExtension.NetCore.MemoryEditor/MemoryEditor.cs +19 -26
@@ -27,22 +27,11 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
27 27 /// <summary>
28 28 /// 当前目标进程
29 29 /// </summary>
30 public Process? CurrentProcess
31 {
32 get => listenerManager.CurrentProcess;
33 set
34 {
35 if (value is not null)
36 {
37 listenerManager.CurrentProcess = value;
38
39 }
40 }
41 }
30 public Process? CurrentProcess { get => listenerManager.CurrentProcess; set => listenerManager.CurrentProcess = value; }
42 31 /// <summary>
43 32 /// 进程句柄
44 33 /// </summary>
45 public nint ProcessHandle { get => listenerManager.ProcessHandler; set => listenerManager.ProcessHandler = value; }
34 public nint ProcessHandler { get => listenerManager.ProcessHandler; set => listenerManager.ProcessHandler = value; }
46 35 /// <summary>
47 36 /// 内存监听器
48 37 /// </summary>
@@ -58,7 +47,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
58 47 /// <summary>
59 48 /// 自动重新获取进程的检测频率(单位毫秒)
60 49 /// </summary>
61 public int AutoReacquireProcessFrequency { get => listenerManager.AutoReacquireProcessFrequency; set => listenerManager.AutoReacquireProcessFrequency = value; }
50 public int AutoReacquireProcessFrequency { get => listenerManager.ReacquireProcessFrequency; set => listenerManager.ReacquireProcessFrequency = value; }
62 51 /// <summary>
63 52 /// 进程句柄权限(不懂勿填)
64 53 /// </summary>
@@ -68,13 +57,20 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
68 57 /// </summary>
69 58 public ProcessType ProcessBiteType { get; set; }
70 59 /// <summary>
60 /// 等待目标进程出现
61 /// </summary>
62 /// <param name="processName">进程名称</param>
63 /// <param name="frequency">检测频率</param>
64 /// <returns></returns>
65 public async Task WaitProcessEnter(string? processName = null, int frequency = 500) => await listenerManager.WaitProcessEnter(processName, frequency);
66 /// <summary>
71 67 /// 读取指定地址的内存
72 68 /// </summary>
73 69 /// <typeparam name="T">目标类型(int,float,long等)</typeparam>
74 70 /// <param name="address">指定地址</param>
75 71 /// <param name="result">读取结果</param>
76 72 /// <returns>是否读取成功</returns>
77 public bool ReadMemory<T>(nint address, out T result) where T : struct => ReadMemory<T>(ProcessHandle, address, out result);
73 public bool ReadMemory<T>(nint address, out T result) where T : struct => ReadMemory(ProcessHandler, address, out result);
78 74 /// <summary>
79 75 /// 在指定内存地址中写入数据
80 76 /// </summary>
@@ -82,7 +78,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
82 78 /// <param name="address">目标地址</param>
83 79 /// <param name="source">待写入值</param>
84 80 /// <returns>是否写入成功</returns>
85 public bool WriteMemory<T>(nint address, T source) where T : struct => WriteMemory<T>(ProcessHandle, address, source);
81 public bool WriteMemory<T>(nint address, T source) where T : struct => WriteMemory(ProcessHandler, address, source);
86 82 /// <summary>
87 83 /// 解析基址对应的实际地址
88 84 /// </summary>
@@ -90,7 +86,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
90 86 /// <param name="baseAddress">基址的地址部分</param>
91 87 /// <param name="offsets">基址的偏移组</param>
92 88 /// <returns>实际地址</returns>
93 public nint ResolvePointerAddress(string moduleName, int baseAddress, params nint[] offsets) => CurrentProcess is null ? default : ResolvePointerAddress(CurrentProcess, moduleName, baseAddress, ProcessBiteType, offsets);
89 public nint ResolvePointerAddress(string moduleName, nint baseAddress, params nint[] offsets) => CurrentProcess is null ? default : ResolvePointerAddress(CurrentProcess, moduleName, baseAddress, ProcessBiteType, offsets);
94 90 /// <summary>
95 91 /// 解析基址对应的实际地址
96 92 /// </summary>
@@ -126,8 +122,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
126 122 /// </summary>
127 123 /// <param name="process">进程</param>
128 124 /// <param name="processType">进程位数类型(32/64)</param>
129 /// <param name="processAccessFlags">进程访问权限</param>
130 public MemoryEditor(Process process, ProcessType processType = ProcessType.Bit64, ProcessAccessFlags processAccessFlags = ProcessAccessFlags.All)
125 public MemoryEditor(Process process, ProcessType processType = ProcessType.Bit64)
131 126 {
132 127 CurrentProcess = process;
133 128 ProcessBiteType = processType;
@@ -140,8 +135,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
140 135 /// </summary>
141 136 /// <param name="processName">进程名称</param>
142 137 /// <param name="processType">进程位数类型(32/64)</param>
143 /// <param name="processAccessFlags">进程访问权限</param>
144 public MemoryEditor(string processName, ProcessType processType = ProcessType.Bit64, ProcessAccessFlags processAccessFlags = ProcessAccessFlags.All)
138 public MemoryEditor(string processName, ProcessType processType = ProcessType.Bit64)
145 139 {
146 140 CurrentProcess = Process.GetProcessesByName(processName).First();
147 141 ProcessBiteType = processType;
@@ -154,8 +148,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
154 148 /// </summary>
155 149 /// <param name="processId">进程PID</param>
156 150 /// <param name="processType">进程位数类型(32/64)</param>
157 /// <param name="processAccessFlags">进程访问权限</param>
158 public MemoryEditor(int processId, ProcessType processType = ProcessType.Bit64, ProcessAccessFlags processAccessFlags = ProcessAccessFlags.All)
151 public MemoryEditor(int processId, ProcessType processType = ProcessType.Bit64)
159 152 {
160 153 CurrentProcess = Process.GetProcessById(processId);
161 154 ProcessBiteType = processType;
@@ -277,7 +270,7 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
277 270 /// <param name="processType">目标进程类型</param>
278 271 /// <param name="offsets">基址的偏移组</param>
279 272 /// <returns>实际地址</returns>
280 public static nint ResolvePointerAddress(Process process, string moduleName, int baseAddress, ProcessType processType, params nint[] offsets) => ResolvePointerAddress(process, GetModuleBaseAddress(process, moduleName), baseAddress, processType, offsets);
273 public static nint ResolvePointerAddress(Process process, string moduleName, nint baseAddress, ProcessType processType, params nint[] offsets) => ResolvePointerAddress(process, GetModuleBaseAddress(process, moduleName), baseAddress, processType, offsets);
281 274 /// <summary>
282 275 /// 解析基址对应的实际地址
283 276 /// </summary>
@@ -287,9 +280,9 @@ public partial class MemoryEditor : MemoryListenerManagerBase, IDisposable
287 280 /// <param name="processType">目标进程类型</param>
288 281 /// <param name="offsets">基址的偏移组</param>
289 282 /// <returns>实际地址</returns>
290 public static nint ResolvePointerAddress(Process process, nint moduleBaseAddress, int baseAddress, ProcessType processType, params nint[] offsets)
283 public static nint ResolvePointerAddress(Process process, nint moduleBaseAddress, nint baseAddress, ProcessType processType, params nint[] offsets)
291 284 {
292 var resolvedAddress = nint.Add(moduleBaseAddress, baseAddress);
285 var resolvedAddress = moduleBaseAddress + baseAddress;
293 286 if (processType == ProcessType.Bit32)
294 287 {
295 288 foreach (nint offset in offsets)