2016-03-18 3 views
0


Я использую функцию WinProI WriteProcessMemory из kernel32.dll для записи в память другого процесса.
Он работал хорошо несколько раз, но затем он просто прекратил работать правильно.C# WriteProcessMemory странное исключение stackoverflow

Я импортировать эту функцию с этим кодом:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten); 

И вот код, который я использую, чтобы написать:

int bytesWritten; 
WriteProcessMemory(hProcess, (IntPtr)dwAdress, data, (uint)size, out bytesWritten); 

Он просто бросает это исключение:

System.OverflowException

Debug inf О:

debug info

Может кто-нибудь помочь мне с этой проблемой?

+1

Это не исключение переполнения стека. 'System.OverflowException' возникает при арифметике или переполнении. Вы создаете 64-битное приложение? – Ari0nhh

ответ

2

Ваш p/invoke объявлен неверно. Последние два параметра: SIZE_T, размер указателя. Ваш код должен быть:

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool WriteProcessMemory(
    IntPtr hProcess, 
    IntPtr lpBaseAddress, 
    byte[] lpBuffer, 
    UIntPtr nSize, 
    out UIntPtr lpNumberOfBytesWritten 
); 

Обратите внимание, что SIZE_T является тип без знака, следовательно, использование UIntPtr. Если использовать неподписанный тип не удобно, вы можете переключить выше, чтобы использовать , так как вы больше не будете писать больше 2 байтов.

Код, который вы указали, не проверяет возвращаемое значение WriteProcessMemory. Всегда проверяйте возвращаемые значения для ошибок. Например:

if (!WriteProcessMemory(...)) 
    throw new Win32Exception(); 
+0

Это не сработало. Win32Exception говорит, что я пишу неверный адрес. Конечно, как обычно. Я уже ненавижу C#. Перемещение на C++ – NulledCoder

+0

Эта проблема с вашим кодом. Код в этом ответе является точным. –

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