C#WriteProcessMemory奇怪的stackoverflow异常

时间:2016-03-18 10:16:08

标签: c# winapi


我使用来自kernel32.dll的WinAPI函数WriteProcessMemory写入另一个进程'内存。
它工作了好几次,但之后就停止了正常工作。

我使用以下代码导入此功能:

[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 info

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分: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。如果使用无符号类型不方便,可以将上面的内容切换为使用IntPtr,因为你永远不会写2个 63 字节。

您提供的代码不会测试WriteProcessMemory的返回值。请始终检查错误的返回值。例如:

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