2012-06-27 88 views
3

我想访问一个32位地址,但是当我创建IntPtr时,它会抛出一个OverflowException。代码如下:访问32位内存地址c#

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

我该如何访问该地址?

+1

你为什么要访问该地址? –

+1

您尝试阅读的地址位于3GB点 - 取决于您的操作系统我相信这是一个受限地址 – Dave

+0

请提供更多信息。 –

回答

2

你的程序CAN NOT访问其他程序的内存地址(无论是你要读取的地址不适合的Int32,看到this post明白它是什么),只需使用IntPtr,因为他们中运行他们的私有地址空间

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

如果你确定内存地址(如何?甚至可能需要扫描进程内存),你必须P/Invoke ReadProcessMemory(),这是一个功能设计用于调试目的,如果你的可执行文件有足够的权限,你可以读取另一个进程的内存。
查看this post here on SO的例子。

3

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

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

2

通过传递一个uintIntPtr,你将其转换为long,作为IntPtr不支持无符号整数。然后,如果您运行的是32位进程,则uint会溢出int

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