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++时,问题出在代码上。这个答案中的代码是准确的。