using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Growl.Core.Memory
{
public class Trainer
{
public Process Process { get; }
public bool IsValid { get { return Process != null && Process.Handle != null && !Process.HasExited; } }
public Trainer(Process process)
{
Process = process;
}
private uint RecalculateAddress(uint address, params uint[] offset)
{
for (int i = 0; i < offset.Length; i++)
{
if (i == offset.Length)
{
return address + offset[i];
}
else
{
address = (uint)ReadInt(address + offset[i]);
}
}
return address;
}
public int ReadInt(uint address)
{
var read = 0u;
var value = -1;
ReadInt(Process.Handle, address, out value, sizeof(int), out read);
return value;
}
public int ReadInt(uint address, params uint[] offset)
{
return ReadInt(RecalculateAddress(address, offset));
}
public bool WriteInt(uint address, int value)
{
var write = 0u;
WriteInt(Process.Handle, address, ref value, sizeof(int), out write);
return write > 0;
}
public bool WriteInt(uint address, int value, params uint[] offset)
{
return WriteInt(RecalculateAddress(address, offset), value);
}
public float ReadFloat(uint address)
{
var read = 0u;
var value = -1f;
ReadFloat(Process.Handle, address, out value, sizeof(float), out read);
return value;
}
public float ReadFloat(uint address, params uint[] offset)
{
return ReadFloat(RecalculateAddress(address, offset));
}
public bool WriteFloat(uint address, float value)
{
var write = 0u;
WriteFloat(Process.Handle, address, ref value, sizeof(float), out write);
return write > 0;
}
public bool WriteFloat(uint address, float value, params uint[] offset)
{
return WriteFloat(RecalculateAddress(address, offset), value);
}
public byte ReadByte(uint address)
{
var read = 0u;
var value = default(byte);
ReadByte(Process.Handle, address, out value, sizeof(byte), out read);
return value;
}
public byte ReadByte(uint address, params uint[] offset)
{
return ReadByte(RecalculateAddress(address, offset));
}
public bool WriteByte(uint address, byte value)
{
var write = 0u;
WriteByte(Process.Handle, address, ref value, sizeof(byte), out write);
return write > 0;
}
public bool WriteByte(uint address, byte value, params uint[] offset)
{
return WriteByte(RecalculateAddress(address, offset), value);
}
public uint GetModuleAddress(string name)
{
foreach (ProcessModule module in Process.Modules)
{
if (module.ModuleName.ToLower() == name.ToLower() || Regex.Match(module.ModuleName.ToLower(), name.ToLower()).Success)
{
return (uint)module.BaseAddress.ToInt32();
}
}
return default(UInt32);
}
[DllImport("kernelbase", EntryPoint = "ReadProcessMemory")]
private static extern IntPtr ReadInt(IntPtr handle, uint address, out int value, uint length, out uint read);
[DllImport("kernelbase", EntryPoint = "WriteProcessMemory")]
private static extern IntPtr WriteInt(IntPtr handle, uint address, ref int value, uint length, out uint write);
[DllImport("kernelbase", EntryPoint = "ReadProcessMemory")]
private static extern IntPtr ReadFloat(IntPtr handle, uint address, out float value, uint length, out uint read);
[DllImport("kernelbase", EntryPoint = "WriteProcessMemory")]
private static extern IntPtr WriteFloat(IntPtr handle, uint address, ref float value, uint length, out uint write);
[DllImport("kernelbase", EntryPoint = "ReadProcessMemory")]
private static extern IntPtr ReadByte(IntPtr handle, uint address, out byte value, uint length, out uint read);
[DllImport("kernelbase", EntryPoint = "WriteProcessMemory")]
private static extern IntPtr WriteByte(IntPtr handle, uint address, ref byte value, uint length, out uint write);
}
}