C#WriteProcessMemory奇怪堆栈溢出异常

C#WriteProcessMemory奇怪堆栈溢出异常,c#,winapi,C#,Winapi,我正在从kernel32.dll使用WinAPI函数WriteProcessMemory写入另一个进程的内存。 它工作了好几次,但后来就停止正常工作了 我正在使用以下代码导入此函数: [DllImport("kernel32.dll", SetLastError = true)] static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out


我正在从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);
它只是抛出了这个异常:

系统溢出异常

调试信息:


有人能帮我解决这个问题吗?

您的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\u T
是一种无符号类型,因此使用了
uintpttr
。如果使用无符号类型不方便,您可以将上述内容切换为使用
IntPtr
,因为您永远不会写入超过263字节的内容

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

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

您的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\u T
是一种无符号类型,因此使用了
uintpttr
。如果使用无符号类型不方便,您可以将上述内容切换为使用
IntPtr
,因为您永远不会写入超过263字节的内容

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

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

这不是堆栈溢出异常<代码>系统。在算术或强制转换溢出时引发OverflowException。是否创建64位应用程序?这不是堆栈溢出异常<代码>系统。在算术或强制转换溢出时引发OverflowException。您是否创建64位应用程序?它不起作用。Win32Exception说我写的地址不正确。当然,像往常一样。我已经讨厌C了。转到C++时,问题出在代码上。这个答案中的代码是准确的。它不起作用。Win32Exception说我写的地址不正确。当然,像往常一样。我已经讨厌C了。转到C++时,问题出在代码上。这个答案中的代码是准确的。