我想訪問一個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
請提供更多信息。 –