OpenProcess返回错误代码6(error_INVALID_HANDLE)
本文关键字:INVALID HANDLE error 返回 错误代码 OpenProcess | 更新日期: 2023-09-27 18:26:03
我试图使用OpenProcess
函数获得一个正在运行的进程的句柄。然而,当检查错误代码时,我得到了一个错误代码6(error_INVALID_HANDLE)。
这是一个缩小的样本:
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace Test
{
class TestClass
{
[DllImport("kernel32.dll")]
static extern uint GetLastError();
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess,
bool bInheritHandle, int dwProcessId);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(int hProcess, int lpBaseAddress,
byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);
static void Main()
{
var process = Process.GetProcessesByName("Sample")[0];
var processHandle = OpenProcess(0x001F0FFF, false, process.Id);
Console.WriteLine(GetLastError());
int bytesRead = 0;
byte[] buffer = BitConverter.GetBytes(1095090201);
WriteProcessMemory(
(int)processHandle,
0x21F3CAAC,
buffer,
buffer.Length,
ref bytesRead);
Console.ReadKey();
}
}
}
}
我真的不知道为什么它不起作用。它只返回错误代码6。有什么建议吗?
不知怎么的,我觉得这是因为我正在访问的程序,但其他一切都运行得很好,没有返回任何其他错误。
您需要改进错误检查。在请求最后一个错误之前,您需要首先检查OpenProcess
的返回代码是否为null。请注意,DllImport
需要将SetLastError
设置为true才能正确工作,并且不应使用GetLastError
。
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr OpenProcess(int dwDesiredAccess,
bool bInheritHandle, int dwProcessId);
processHandle = OpenProcess(0x001F0FFF, false, process.Id);
if (processHandle == IntPtr.Zero)
{
Console.WriteLine(Marshal.GetLastWin32Error());
}
理想情况下,您应该从本机错误代码创建一个托管异常。这样做的优点是可以使用标准的.NET异常处理,并且可以很好地将错误代码和文本描述封装在异常中:
processHandle = OpenProcess(0x001F0FFF, false, process.Id);
if (processHandle == IntPtr.Zero)
{
// calls Marhal.GetLastWin32Error and GetErrorMessage under the hood
throw new Win32Exception();
}
当然,完成后别忘了给CloseHandle
打电话。