我正在使用以下代码读取内存中的地址。在我看来,我可能做得非常低效,因为我正在为每个地址单独调用,尽管所有地址都是彼此相邻的(1个字节)。
[DllImport("kernel32", EntryPoint = "ReadProcessMemory")]
private static extern byte ReadProcessMemoryByte(int Handle, int Address, ref byte Value, int Size, ref int BytesRead);
该功能类似于:
pseudo:
For loop:
read memory address (base address offset)
add result to array
addressoffset++
所以说我有3个地址,我将进行3次单独的通话。有没有办法只进行一次调用然后执行内部逻辑将结果拆分为3个独立的数据段,如果你知道我的意思?不是逐字节读取,而是一次读取4个字节,然后在添加到数组之前拆分它们?
我问这个的原因是我的程序需要永远经历迭代,有时必须读取多达40,000个地址需要3分钟。如果我可以做我要问的事,那么也许我可以在一分钟内将其删除?
答案 0 :(得分:2)
从http://www.pinvoke.net/default.aspx/kernel32.readprocessmemory开始,方法签名应该是:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out int lpNumberOfBytesRead
);
目前,由于byte
/ lpBuffer
只有一个Value
,因此您一次只能读取一个字节。您可以通过使byte[]
并传递大于1的Size
来读取更多(可能是您打算读取的所有字节,或分解为1024字节块)。