Skeleton generic memory methods
This commit is contained in:
parent
c6dd474b46
commit
1d9e0e7071
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
using WinProcesses = VsChromium.Core.Win32.Processes;
|
using WinProcesses = VsChromium.Core.Win32.Processes;
|
||||||
|
|
||||||
namespace CxbxDebugger
|
namespace CxbxDebugger
|
||||||
|
@ -51,22 +52,87 @@ namespace CxbxDebugger
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint ReadMemory(IntPtr addr)
|
private byte[] ReadMemoryInternal(IntPtr Address, int Size)
|
||||||
{
|
{
|
||||||
byte[] buffer = new byte[4];
|
byte[] buffer = new byte[Size];
|
||||||
|
|
||||||
uint numRead = 0;
|
int numRead = 0;
|
||||||
WinProcesses.NativeMethods.ReadProcessMemory
|
WinProcesses.NativeMethods.ReadProcessMemory
|
||||||
(
|
(
|
||||||
Handle,
|
Handle,
|
||||||
addr,
|
Address,
|
||||||
buffer,
|
buffer,
|
||||||
4,
|
4,
|
||||||
out numRead
|
out numRead
|
||||||
);
|
);
|
||||||
|
|
||||||
return BitConverter.ToUInt32(buffer, 0);
|
// Not handling errors for now
|
||||||
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public T ReadMemory<T>(IntPtr Address)
|
||||||
|
{
|
||||||
|
var size = Marshal.SizeOf(typeof(T));
|
||||||
|
byte[] Data = ReadMemoryInternal(Address, size);
|
||||||
|
|
||||||
|
object Value = default(T);
|
||||||
|
|
||||||
|
TypeCode TType = Type.GetTypeCode(typeof(T));
|
||||||
|
switch (TType)
|
||||||
|
{
|
||||||
|
case TypeCode.Byte:
|
||||||
|
Value = Data[0];
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TypeCode.UInt32:
|
||||||
|
Value = BitConverter.ToUInt32(Data, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new Exception(string.Format("Unhandled type code {0}", TType.ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return (T)Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void WriteMemoryInternal(IntPtr Address, byte[] Data)
|
||||||
|
{
|
||||||
|
int numWritten = 0;
|
||||||
|
WinProcesses.NativeMethods.WriteProcessMemory
|
||||||
|
(
|
||||||
|
Handle,
|
||||||
|
Address,
|
||||||
|
Data,
|
||||||
|
(uint)Data.Length,
|
||||||
|
out numWritten
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteMemory<T>(IntPtr Address, T Value)
|
||||||
|
{
|
||||||
|
byte[] Data = null;
|
||||||
|
|
||||||
|
object GenericValue = Value;
|
||||||
|
|
||||||
|
TypeCode TType = Type.GetTypeCode(Value.GetType());
|
||||||
|
switch (TType)
|
||||||
|
{
|
||||||
|
case TypeCode.Byte:
|
||||||
|
Data = new byte[] { (byte)GenericValue };
|
||||||
|
break;
|
||||||
|
|
||||||
|
case TypeCode.UInt32:
|
||||||
|
Data = BitConverter.GetBytes((uint)GenericValue);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new Exception(string.Format("Unhandled type code {0}", TType.ToString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Data != null)
|
||||||
|
{
|
||||||
|
WriteMemoryInternal(Address, Data);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,8 +50,8 @@ namespace CxbxDebugger
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
var ReturnAddr = OwningProcess.ReadMemory(new IntPtr(ebp + 4));
|
var ReturnAddr = OwningProcess.ReadMemory<uint>(new IntPtr(ebp + 4));
|
||||||
ebp = OwningProcess.ReadMemory(new IntPtr(ebp));
|
ebp = OwningProcess.ReadMemory<uint>(new IntPtr(ebp));
|
||||||
|
|
||||||
if (ebp == 0 || ReturnAddr == ebp)
|
if (ebp == 0 || ReturnAddr == ebp)
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -70,8 +70,12 @@ namespace VsChromium.Core.Win32.Processes
|
||||||
// x1nix: added
|
// x1nix: added
|
||||||
[DllImport("kernel32.dll", SetLastError = true)]
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
[return: MarshalAs(UnmanagedType.Bool)]
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
|
public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] buffer, uint size, out int lpNumberOfBytesRead);
|
||||||
[Out] byte[] buffer, uint size, out uint lpNumberOfBytesRead);
|
|
||||||
|
// x1nix: added
|
||||||
|
[DllImport("kernel32.dll", SetLastError = true)]
|
||||||
|
[return: MarshalAs(UnmanagedType.Bool)]
|
||||||
|
public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);
|
||||||
|
|
||||||
[DllImport("ntdll.dll", SetLastError = true)]
|
[DllImport("ntdll.dll", SetLastError = true)]
|
||||||
public static extern int NtQueryInformationProcess(SafeProcessHandle hProcess, ProcessInfoClass pic, ref ProcessBasicInformation pbi, int cb, out int pSize);
|
public static extern int NtQueryInformationProcess(SafeProcessHandle hProcess, ProcessInfoClass pic, ref ProcessBasicInformation pbi, int cb, out int pSize);
|
||||||
|
|
Loading…
Reference in New Issue