我想访问一个32位地址,但是当我创建IntPtr时,它会抛出一个OverflowException。代码如下:访问32位内存地址c#
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
我该如何访问该地址?
我想访问一个32位地址,但是当我创建IntPtr时,它会抛出一个OverflowException。代码如下:访问32位内存地址c#
uint memAddr = 0xF5920824;
IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[4];
Marshal.Copy(bufPtr, data, 0, 4);
我该如何访问该地址?
你的程序CAN NOT访问其他程序的内存地址(无论是你要读取的地址不适合的Int32
,看到this post明白它是什么),只需使用IntPtr
,因为他们中运行他们的私有地址空间。
它必须以某种方式由第一个程序共享(共享内存或其他)。此外,一个程序中的地址XYZ可能是甚至在同一程序的另一实例中(因为该地址是虚拟的)而完全不同的东西。
如果你确定内存地址(如何?甚至可能需要扫描进程内存),你必须P/Invoke ReadProcessMemory()
,这是一个功能设计用于调试目的,如果你的可执行文件有足够的权限,你可以读取另一个进程的内存。
查看this post here on SO的例子。
对于如此大的数字> 2^31-1,您需要编译为64位。
转到配置管理器...并将平台从x86更改为任何CPU或x64。
通过传递一个uint
到IntPtr
,你将其转换为long
,作为IntPtr
不支持无符号整数。然后,如果您运行的是32位进程,则uint
会溢出int
。
您需要使用64位来读取该地址。
你为什么要访问该地址? –
您尝试阅读的地址位于3GB点 - 取决于您的操作系统我相信这是一个受限地址 – Dave
请提供更多信息。 –