Как избавится от System.AccessViolationException, возникающего в ReadProcessMemory? C#
Я пытаюсь прочесть значение, записанное в области памяти по адресу 1AD98845170. Там лежит символ 'd', соответственно значение, записанное в этой области - это 64. Эту информацию я взял из Cheat Engine. Но прочесть эту же область памяти в моём приложении на C# я не могу. Оно падает с исключением System.AccessViolationException. В качестве процесса выступает стандартный Блокнот Windows 10. Я совершенно не могу понять в чём проблема. Прошу помочь. P.S.: На англоязычном stack'е ссылались на топик: https://stackoverflow.com/questions/46431860/how-to-use-readprocessmemory , но он мне не помог.
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(IntPtr hProcess, Int64 lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
public void button_Click(object sender, EventArgs e)
{
Process process = Process.GetProcessesByName("notepad")[0];
IntPtr processHandle = OpenProcess(0x0010, false, process.Id);
int bytesRead = 0;
byte[] buffer = new byte[12];
ReadProcessMemory(processHandle, 0x1AD98845170, buffer, buffer.Length, ref bytesRead); // problem is here
string res = Encoding.Unicode.GetString(buffer) + " (" + bytesRead.ToString() + "bytes)";
textBox.Text = res.ToString();
}
Ответы (1 шт):
ReadProcessMemory объявлена для 64-разрядного процесса, а сама программа, была 32-разрядная, отсюда и падение. По ссылке находится рабочий пример для 32-разрядного процесса, но он бы всё равно не помог, так как адрес 0x1AD98845170 не подходит для 32-разрядного адресного пространства.