using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using RomCheater.Interfaces;
using Sojaner.MemoryScanner.MemoryProviers;
using ManagedWinapi;
namespace RomCheater.PluginFramework.Core
{
///
/// The base class for all plugins
///
public abstract class PluginBase : IPluginBase
{
public PluginBase() { }
public virtual bool IsNullPlugin { get { return false; } }
public virtual bool IsGenericPlugin { get { return false; } }
public IWebBrowserInterface WebBrowserInterface
{
get
{
if (this.AcceptedConfig != null)
{
if (this.AcceptedConfig.WebBrowserProvider != null)
{
return this.AcceptedConfig.WebBrowserProvider.GetProvider();
}
}
return WebBrowserProvider.Empty.GetProvider();
}
}
public void ReadProcessMemory(ulong MemoryAddress, ulong bytesToRead, out ulong bytesRead, out byte[] data)
{
try
{
bytesRead = 0x00;
data = new byte[bytesToRead];
if (this.AcceptedConfig == null || this.AcceptedProcess == null) { return; }
IConfigPlugin config = this.AcceptedConfig;
Process proc = this.AcceptedProcess;
using (GenericMemoryProvider provider = new GenericMemoryProvider(config, proc))
{
provider.OpenProvider();
provider.ReadProcessMemory(MemoryAddress, bytesToRead, out bytesRead, out data);
provider.CloseProvider();
}
}
catch (Exception ex)
{
throw ex;
}
}
public void WriteProcessMemory(long MemoryAddress, byte[] bytesToWrite, out ulong bytesWritten)
{
try
{
bytesWritten = 0;
if (this.AcceptedConfig == null || this.AcceptedProcess == null) { return; }
IConfigPlugin config = this.AcceptedConfig;
Process proc = this.AcceptedProcess;
using (GenericMemoryProvider provider = new GenericMemoryProvider(config, proc))
{
provider.OpenProvider();
provider.WriteProcessMemory(MemoryAddress, bytesToWrite, out bytesWritten);
provider.CloseProvider();
}
}
catch (Exception ex)
{
throw ex;
}
}
public List QueryMemoryRegions()
{
if (this.AcceptedConfig == null || this.AcceptedProcess == null) { return new List(); }
IConfigPlugin config = this.AcceptedConfig;
Process proc = this.AcceptedProcess;
List MemoryRegions = new List();
using (GenericMemoryProvider provider = new GenericMemoryProvider(config, proc))
{
provider.OpenProvider();
if (this.peData != null)
{
if (this.peData.Is32bitAssembly())
{
MemoryRegions = provider.QueryMemoryRegions(MemorySizeConstants.MinimumAddress, MemorySizeConstants.MaximumAddressSize_x86);
}
else
{
MemoryRegions = provider.QueryMemoryRegions(MemorySizeConstants.MinimumAddress, MemorySizeConstants.MaximumAddressSize_x64);
}
}
else
{
MemoryRegions = provider.QueryMemoryRegions(MemorySizeConstants.MinimumAddress, MemorySizeConstants.MaximumAddressSize_x86);
}
provider.CloseProvider();
}
return MemoryRegions;
}
#region IPluginBase Members
public abstract Guid ID { get; }
public abstract string Name { get; }
public abstract string Description { get; }
public virtual void Reload() { Reload(false); }
public abstract void Reload(bool silent);
#endregion
public override string ToString()
{
return string.Format("{0} [{1}]", Name, ID.ToString());
}
private IPEDData _peData;
protected IPEDData peData { get { return _peData; } }
public void SetPEViewerData(IPEDData peData)
{
_peData = peData;
if (OnPEDataUpdated != null)
{
OnPEDataUpdated.Invoke(new PEViewerDataUpdatedEventArgs(this, peData));
}
}
private Process _AcceptedProcess;
protected Process AcceptedProcess { get { return _AcceptedProcess; } }
public void SetAcceptedProcess(Process proc)
{
_AcceptedProcess = proc;
if (OnSelectedProcessChanged != null)
{
OnSelectedProcessChanged.Invoke(new ProcessChangedEventArgs(this, proc.Id));
}
}
private IConfigPlugin _AcceptedConfig;
protected IConfigPlugin AcceptedConfig { get { return _AcceptedConfig; } }
public void SetAcceptedConfig(IConfigPlugin config)
{
_AcceptedConfig = config;
if (OnSelectedConfigChanged != null)
{
OnSelectedConfigChanged.Invoke(new ConfigChangedEventArgs(this, config));
}
}
public void SetAcceptedProcessAndConfig(IAcceptsProcessAndConfig iapc)
{
SetAcceptedConfig(iapc.AcceptedPlugin);
SetAcceptedProcess(iapc.AcceptedProcess);
}
public event BaseEventHandler OnPEDataUpdated;
public event BaseEventHandler OnSelectedProcessChanged;
public event BaseEventHandler OnSelectedConfigChanged;
public void RaisePluginFrameworkEvents()
{
if (this.OnPEDataUpdated != null)
{
if (this.peData != null)
{
this.OnPEDataUpdated.Invoke(new PEViewerDataUpdatedEventArgs(this, this.peData));
}
}
if (this.OnSelectedProcessChanged != null)
{
if (this.AcceptedProcess != null)
{
this.OnSelectedProcessChanged.Invoke(new ProcessChangedEventArgs(this, this.AcceptedProcess.Id));
}
}
if (this.OnSelectedConfigChanged != null)
{
if (this.AcceptedConfig != null)
{
this.OnSelectedConfigChanged.Invoke(new ConfigChangedEventArgs(this, this.AcceptedConfig));
}
}
}
}
}