using System.Collections;
using System.Diagnostics;
using XFEExtension.NetCore.DelegateExtension;
namespace XFEExtension.NetCore.MemoryEditor.Manager;
///
/// 内存地址管理器
///
public abstract class MemoryManager : IMemoryManager
{
private protected bool disposedValue;
private protected XFEEventHandler? valueChanged;
///
/// 当指定地址的内存值变化时触发
///
public event XFEEventHandler? ValueChanged { add => valueChanged += value; remove => valueChanged -= value; }
///
/// 当前进程结束时触发
///
public event EventHandler? CurrentProcessExit;
///
/// 目标进程启动时触发
///
public event EventHandler? CurrentProcessEntered;
///
/// 当前目标进程
///
public Process? CurrentProcess { get => Editor.CurrentProcess; set => Editor.CurrentProcess = value; }
///
/// 进程句柄
///
public nint ProcessHandler { get => Editor.ProcessHandler; set => Editor.ProcessHandler = value; }
///
/// 目标进程名称
///
public string ProcessName { get => Editor.ProcessName; set => Editor.ProcessName = value; }
///
/// 当目标进程退出后,是否自动重新获取进程
///
public bool AutoReacquireProcess { get => Editor.AutoReacquireProcess; set => Editor.AutoReacquireProcess = value; }
///
/// 重新获取进程的检测频率(单位毫秒)
///
public int ReacquireProcessFrequency { get => Editor.AutoReacquireProcessFrequency; set => Editor.AutoReacquireProcessFrequency = value; }
///
/// 进程句柄权限(不懂勿填)
///
public ProcessAccessFlags ProcessAccessFlags { get => Editor.ProcessAccessFlags; set => Editor.ProcessAccessFlags = value; }
///
/// 进程位数类型(32/64)
///
public ProcessType ProcessBiteType { get => Editor.ProcessBiteType; set => Editor.ProcessBiteType = value; }
///
/// 编辑器
///
public MemoryEditor Editor { get; protected set; } = new();
///
/// 等待目标进程出现
///
/// 进程名称
/// 检测频率
///
public async Task WaitProcessEnter(string? processName = null, int frequency = 500) => await Editor.WaitProcessEnter(processName, frequency);
///
/// 移除指定名称的地址
///
/// 地址名称
public abstract void Remove(string addressName);
internal abstract void Add(MemoryItemBuilder builder);
///
/// 添加地址
///
/// 内存地址构建器组
public void Add(params MemoryItemBuilder[] builders)
{
foreach (var builder in builders)
Add(builder);
}
///
/// 释放资源
///
///
private protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
Editor.Dispose();
}
disposedValue = true;
}
}
///
/// 释放资源
///
public void Dispose()
{
Dispose(disposing: true);
GC.SuppressFinalize(this);
}
///
/// 获取枚举器
///
///
public abstract IEnumerator GetEnumerator();
///
/// 内存管理器
///
protected MemoryManager()
{
Editor.CurrentProcessEntered += (sender, e) => CurrentProcessEntered?.Invoke(sender, e);
Editor.CurrentProcessExit += (sender, e) => CurrentProcessExit?.Invoke(sender, e);
}
///
/// 创建内存管理器构建器
///
///
public static MemoryManagerBuilder CreateBuilder() => MemoryManagerBuilder.CreateBuilder();
}