C# OpenProcess返回错误代码6(错误\u无效\u句柄)

C# OpenProcess返回错误代码6(错误\u无效\u句柄),c#,winapi,openprocess,C#,Winapi,Openprocess,我尝试使用OpenProcess函数获取运行进程的句柄。但是,当检查错误代码时,我得到一个错误代码6 error\u INVALID\u HANDLE 以下是一个简化示例: using System; using System.Runtime.InteropServices; using System.Diagnostics; namespace Test { class TestClass { [DllImport("kernel32.dll")]

我尝试使用OpenProcess函数获取运行进程的句柄。但是,当检查错误代码时,我得到一个错误代码6 error\u INVALID\u 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,以使其正确工作并获取LASTERROR

理想情况下,您应该从本机错误代码创建一个托管异常。这样做的好处是,您可以使用标准的.NET异常处理,并且可以将错误代码和文本描述很好地包装在异常中:

processHandle = OpenProcess(0x001F0FFF, false, process.Id); 
if (processHandle == IntPtr.Zero)
{
    // calls Marhal.GetLastWin32Error and GetErrorMessage under the hood
    throw new Win32Exception();
}

当然,完成后不要忘记调用CloseHandle。

6是无效的\u HANDLE,GetLastError只有在OpenProcess失败时才有效,即processHandle==0时是这样吗?SetLastError=true应添加到属性中,Sample是什么类型的进程?-这是你真正的密码吗?就目前情况而言,它不会这样做compile@AlexK. 首先,yea processHandle返回0。示例是一个标准的.exe程序。不,这不是我真正的代码,因为我只是从中提取了一部分,并试图将其保持在较小的范围内。它最初是一个Windows窗体应用程序。显示不正确检查错误的伪代码并不酷。请纠正这一点,不要再这样做了。除非你这么做,否则我们很难相信这里写的任何东西。魔法常数也非常有用。我们真的要去查一下,看看你指定了什么访问权限。你的金科玉律是,你应该让我们尽可能容易地帮助你。我们的想法是,你尽可能多地做腿部工作,而我们只做你不能做的部分。@DirkVollmar询问者说,这不是我的真实想法code@DirkVollmar好吧,如果你认为这个问题已经有了所有需要的答案,并且这个问题无法改进,那就好了。我不同意。它仍在打印6,在第二个示例中,它返回的句柄无效,但不是原因…未处理的异常:System.ComponentModel.Win32Exception:句柄无效invalid@DirkVollmar当您抛出该异常时,您希望发生什么。除此之外,别无指望。你能解释为什么返回错误无效句柄吗?这毕竟是个问题。对这个答案的第一个评论与这个假设相矛盾。这就是伪代码的问题。我们无法看到asker正在运行的代码。也许它正确地处理了错误,而OpenProcess确实提供了错误句柄。或者询问者的代码仍然错误地处理错误。这就是问题的症结所在。我们最终试图对一些我们看不见的东西进行推理。我们需要向询问者展示他们正在运行的代码,以及正确的错误处理,然后我们才能继续前进。
processHandle = OpenProcess(0x001F0FFF, false, process.Id); 
if (processHandle == IntPtr.Zero)
{
    // calls Marhal.GetLastWin32Error and GetErrorMessage under the hood
    throw new Win32Exception();
}