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バイトを読み取り、配列に追加する前にそれらを分割しますか?

私がこれを求めている理由は、私のプログラムが反復を実行するのに永遠にかかり、時には3分かかる最大40,000のアドレスを読み取らなければならないからです。私が求めていることを実行できれば、1分以内に削減できるかもしれません。

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

現在、単一byteの for lpBuffer/しかないため、一度にValue1 バイトしか読み取っていません。それを a にして1 より大きいabyte[]を渡すことで、さらに多く (おそらく、読み取る予定のすべてのバイト、または 1024 バイトのチャンクに分割) を読み取ることができます。Size

于 2012-06-28T22:34:13.597 に答える