0

我正在使用以下代码读取内存中的地址。我突然想到我这样做的效率可能非常低,因为我正在对每个地址进行单独调用,尽管所有地址都是彼此的邻居(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 个单独的电话。如果您知道我的意思,有没有办法只进行 1 次调用,然后执行内部逻辑将结果分成 3 个单独的数据段?就像不是逐字节读取,而是一次读取 4 个字节,然后在添加到数组之前将它们拆分?

我问这个的原因是我的程序需要很长时间才能完成迭代,有时必须读取多达 40,000 个地址,这需要 3 分钟。如果我能做到我所要求的,那么也许我可以在一分钟内将其缩短?

4

1 回答 1

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
   );

目前,由于您只有一个bytefor lpBuffer/ Value,因此您一次只能读取一个字节。byte[]通过设置 a并传递Size大于 1的值,您可以读取更多内容(可能是您打算读取的所有字节,或者分解成 1024 字节的块) 。

于 2012-06-28T22:34:13.597 回答