我制作了一个方法,通过提供所需的偏移量 + 起始地址来读取多指针。(下面的代码)。总而言之,我试图简化这种方法,下面我将解释我的问题。
我一直在为转换而苦苦挣扎。参数是IntPtr,读取地址的输出是字节数组,我的第一个想法是:“将字节数组转换为IntPtr,重新处理,最后将最后读取的地址转换为int32(因为最后的地址不是指针它永远不会被读取,所以在这里转换为 Int32 应该没问题)",
然而,这并没有给出一个好的结果。所以目前我坚持将字节数组转换为 Int32,然后将 Int32 转换为 IntPtr 的解决方案。人们确实说位转换器是一种不好的方法,因为它可能会在 64 位平台上引起问题,而且我也相信有一种方法可以提供更好的性能(因为我将对象转换了 2 次)。
最后,如果有人认为可以在 C++ 中创建一个类似的函数,然后在 C# 中 P/Invoke 它(我想那样会更有效?)请告诉我。(我正在尝试调整我的编程知识。并且发现语言组合非常有趣)
[DllImport("kernel32.dll", EntryPoint = "ReadProcessMemory")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
[In, Out] byte[] buffer, Int32 sizeout, out IntPtr lpNumberOfBytesRead);
public Int32 ReadBytes(IntPtr Handle, IntPtr Address, int[] Offsets, int BytesToRead = 4)
{
IntPtr ptrBytesRead;
byte[] value = new byte[BytesToRead];
ReadProcessMemory(Handle, Address, value, BytesToRead, out ptrBytesRead);
//Read Offsets
for (int i = 0; i < Offsets.Length; i++)
{
ReadProcessMemory(Handle,
new IntPtr(BitConverter.ToInt32(value, 0) + Offsets[i]),
value,
BytesToRead,
out ptrBytesRead);
}
return BitConverter.ToInt32(value, 0);
}
任何简化此方法的想法将不胜感激!提前感谢!