【发布时间】:2015-12-08 11:33:08
【问题描述】:
我尝试使用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。有什么建议吗?
不知何故,我觉得这是因为我正在访问的程序,但其他一切都运行良好,没有返回任何其他错误。
【问题讨论】:
-
6是INVALID_HANDLE,GetLastError()仅在OpenProcess()失败时有效,即processHandle == 0是这种情况吗?SetLastError = true应该添加到属性中,Sample是什么类型的进程? - 这是你的真实密码吗?就目前而言,它不会编译 -
@AlexK。首先,是的,processHandle 返回 0。示例是一个标准的 .exe 程序。不,这不是我真正的代码,因为我只是从中提取了一部分并试图保持它的小(它最初是一个 Windows 窗体应用程序)
-
显示不能正确检查错误的假代码并不酷。请把它改正,不要再这样做了。在您这样做之前,我们很难相信这里写的任何内容。魔术常数也非常有用。我们真的要查找他们以找出您指定的访问权限。您的黄金法则是,您应该让我们尽可能轻松地为您提供帮助。我们的想法是您尽可能多地做腿部工作,而我们只做您不能做的部分。
-
@DirkVollmar 提问者说,“这不是我的真实代码”
-
@DirkVollmar 好的,好吧,如果您认为该问题具有明确回答所需的所有内容,并且该问题无法改进,那很好。我不同意。
标签: c# winapi openprocess