代码之家  ›  专栏  ›  技术社区  ›  Vladimir M.

C#OpenProcess返回错误1150

  •  0
  • Vladimir M.  · 技术社区  · 7 年前

    以下是我编写的用于打开进程的代码:

            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern UIntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            private static extern bool CloseHandle(UIntPtr hObject);
    
            private const uint PROCESS_QUERY_INFORMATION = 0x0400;
    
            public static void processInfo() {
                uint PID = 3144;
                UIntPtr handle = UIntPtr.Zero;
                handle = OpenProcess(PROCESS_QUERY_INFORMATION, false, PID);
                Console.WriteLine(Marshal.GetLastWin32Error());
                Console.WriteLine(handle);
                if (!handle.Equals(UIntPtr.Zero)) {
                    CloseHandle(handle);
                }
            }
    

    Marshal.GetLastWin32Error() 返回任何进程的错误1150。来自MSDN:

    “ERROR\u OLD\u WIN\u VERSION:指定的程序需要更新的版本 共个窗口。"

    我正在Visual Studio 2015社区版的Windows 2008 R2中运行此代码。目标框架在项目设置中设置为“.NET Framework 4.5.2”。

    此外,由于返回的句柄不是零,OpenProcess似乎仍然能够完成它的工作。我应该担心这个错误吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   David Heffernan    7 年前

    从文档中:

    如果函数成功,则返回值是 指定的进程。

    如果函数失败,则返回值为NULL。获取扩展错误 信息,呼叫 GetLastError .

    请注意,唯一提到的通话 错误信息 如果功能失败。由返回值指示。只有在函数失败时才检查错误代码,在这种情况下它才具有有意义的值。您的错误是无条件地检查错误代码。

    handle = OpenProcess(...);
    if (handle == UIntPtr.Zero)
        // only now call Marshal.GetLastWin32Error
    

    还要注意的是,分配 handle 两次您写道:

    UIntPtr handle = UIntPtr.Zero;
    handle = OpenProcess(...);
    

    当然,编译器警告说这毫无意义,没有使用分配给handle的值。您的代码类似于:

    int i = 1;
    i = 2;
    

    我相信你永远不会这样做。您的代码应为:

    UIntPtr handle = OpenProcess(...);
    
        2
  •  0
  •   GuidedHacking    5 年前

    我不知道你的代码有什么问题,但这里有一个非常简单的实现,我已经测试过了。请记住,您必须以管理员身份运行。

    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApp3
    {
        class Program
        {
            [Flags]
            public enum ProcessAccessFlags : uint
            {
                All = 0x001F0FFF,
                Terminate = 0x00000001,
                CreateThread = 0x00000002,
                VirtualMemoryOperation = 0x00000008,
                VirtualMemoryRead = 0x00000010,
                VirtualMemoryWrite = 0x00000020,
                DuplicateHandle = 0x00000040,
                CreateProcess = 0x000000080,
                SetQuota = 0x00000100,
                SetInformation = 0x00000200,
                QueryInformation = 0x00000400,
                QueryLimitedInformation = 0x00001000,
                Synchronize = 0x00100000
            }
    
            [DllImport("kernel32.dll", SetLastError = true)]
            public static extern IntPtr OpenProcess(
            ProcessAccessFlags processAccess, bool bInheritHandle, int processId);
            static void Main(string[] args)
            {
                Process proc = Process.GetProcessesByName("ac_client")[0];
    
                var hProc = OpenProcess(ProcessAccessFlags.All, false, proc.Id);
            }
        }
    }