2012-06-27 4 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

Адрес, который вы пытаетесь прочитать, находится в точке 3 ГБ - в зависимости от вашей ОС. Я считаю, что это ограниченный адрес. – Dave

+0

Просьба предоставить дополнительную информацию. –

ответ

2

Ваша программа НЕ МОЖЕТ доступ адрес памяти другой программы (независимо, что адрес, который вы собираетесь читать не может уместить Int32 см this post, чтобы понять, что это такое), просто используя IntPtr, потому что они работают в их приватное адресное пространство.

Он должен быть каким-то образом передан первой программой (разделяемая память или что-то еще). Более того, адрес XYZ в одной программе может быть что-то совершенно другое даже в другом экземпляре той же программы (потому что адрес VIRTUAL).

Если вы уверены в адресе памяти (как это может быть необходимо для сканирования памяти процесса), вы должны P/Invoke ReadProcessMemory(), это функция, предназначенная для целей отладки, и если ваш исполняемый файл имеет достаточно привилегий, вы можете прочитайте память другого процесса.
См. Пример this post here on SO.

3

Для такого большого количества> 2^31-1 вам необходимо скомпилировать как 64 бит.

Перейти в Configuration Manager ... и сменить платформу с x86 на любой процессор или x64.

2

При пропускании uint к IntPtr, вы преобразования его в long, поскольку IntPtr не поддерживает целые числа без знака. Затем, если вы работаете в 32-битном процессе, ваш uint переполняет int.

Чтобы прочитать этот адрес, вам необходимо использовать 64-битный код.

Смежные вопросы