32ビットアドレスにアクセスしようとしていますが、IntPtrを作成すると、OverflowExceptionがスローされます。コードは次のとおりです。
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
そのアドレスにアクセスするにはどうすればよいですか?
32ビットアドレスにアクセスしようとしていますが、IntPtrを作成すると、OverflowExceptionがスローされます。コードは次のとおりです。
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
そのアドレスにアクセスするにはどうすればよいですか?
このような大きな数 > 2^31-1 の場合は、64 ビットとしてコンパイルする必要があります。
Configuration Manager... に移動し、プラットフォームを x86 から Any CPU または x64 に変更します。
プログラムは別のプログラムのメモリ アドレスにアクセスできません(読み取るアドレスが に適合しない場合でも、この投稿Int32
を参照して、それが何であるかを理解してください) を使用するだけです。IntPtr
最初のプログラム (共有メモリなど) で何らかの形で共有する必要があります。さらに、あるプログラムのアドレス XYZは、同じプログラムの別のインスタンスでもまったく異なるものになる場合があります (アドレスが VIRTUAL であるため)。
メモリ アドレスが確かな場合 (どうやって? プロセス メモリをスキャンする必要さえあるかもしれません)、 P/Invoke を実行する必要があります。これはReadProcessMemory()
、デバッグ目的で設計された関数であり、実行可能ファイルに十分な権限があれば、別のメモリを読み取ることができます。処理する。例については、 SO に関するこの投稿
を参照してください。
By passing a uint
to IntPtr
, you are converting it to a long
, as IntPtr
doesn't support unsigned integers. Then, if you are running in a 32-bit process, your uint
overflows an int
.
You need to use 64-bit to read that address.