3

我正在尝试访问一个 32 位地址,但是当我创建 IntPtr 时,它会抛出一个 OverflowException。这是代码:

uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);

我怎样才能访问该地址?

4

3 回答 3

3

对于如此大的数字 > 2^31-1,您需要编译为 64 位。

转到配置管理器...并将平台从 x86 更改为 Any CPU 或 x64。

于 2012-06-27T15:11:59.720 回答
2

通过将 a 传递uintIntPtr,您将其转换为 a long,因为IntPtr不支持无符号整数。然后,如果您在 32 位进程中运行,则会uint溢出int.

您需要使用 64 位来读取该地址。

于 2012-06-27T15:12:13.617 回答
2

您的程序不能访问另一个程序的内存地址(不管您要读取的地址不适合Int32,请参阅这篇文章以了解它是什么),IntPtr因为它们在其私有地址空间内运行。

它必须以某种方式由第一个程序(共享内存或其他东西)共享。此外,即使在同一程序的另一个实例中,一个程序中的地址 XYZ也可能完全不同(因为地址是虚拟的)。

如果您确定内存地址(如何?甚至可能需要扫描进程内存),您必须 P/Invoke ReadProcessMemory(),这是一个为调试目的而设计的函数,如果您的可执行文件有足够的权限,您可以读取另一个内存过程。
例如,请参阅SO 上的这篇文章

于 2012-06-27T15:19:53.493 回答