2012-06-27 143 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位來讀取該地址。