Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос C# InvalidProgramException при вызове ReadProcessMemory

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
309
Реакции
7
Народ, кто ковыряет C# и P/Invoke, подсобите разобраться. Столкнулся с ошибкой InvalidProgramException: Common Language Runtime detected an invalid program при попытке дернуть ReadProcessMemory из собственного нативного враппера.

Суть задачи — рид памяти модуля в другом процессе, всё стандартно: нахожу модуль, беру base address и size, пытаюсь сдампить в буфер. Проблема в том, что рантайм падает не при выполнении, а прямо в момент вызова функции через делегат. Код обертки максимально простой:

Код:
Expand Collapse Copy
internal static bool ReadProcessMemory(IntPtr hProcess, IntPtr baseAddress, IntPtr buffer, int size, out IntPtr bytesRead)
{
    return _readProcMem(hProcess, baseAddress, buffer, (IntPtr)size, out bytesRead);
}

Base: 0x7FFC8AE40000
MemSize: 401408 (0x62000)
[ERROR] InvalidProgramException: Common Language Runtime detected an invalid program.
[STACK] at ReadProcessMemory(IntPtr hProcess, IntPtr baseAddress, IntPtr buffer, Int32 size, IntPtr& bytesRead)

Подозрения падают на некорректную маршализацию аргументов в делегате или несовпадение сигнатур (хотя передаю IntPtr и int вроде как по стандарту). Есть мысль, что CLR триггерится на передачу ref/out параметров в натив, либо что-то не так с конвенцией вызова (хотя по умолчанию должен быть stdcall/winapi).

Кто сталкивался с подобным при работе с памятью через C#? Как правильно оформить делегат, чтобы не ловить InvalidProgramException? Просьба подсказать, куда копать, а то я уже перебрал все варианты с Marshal и структурами, результат тот же.

Кто уже допиливал свои врапперы под RPM, отпишитесь, в чем может быть затык?
 
Назад
Сверху Снизу