代码之家  ›  专栏  ›  技术社区  ›  anand

如何从进程id获取进程句柄?

  •  20
  • anand  · 技术社区  · 16 年前

    有什么API可供使用吗。

    我尝试使用OpenProcess,但它返回NULL,GetLastError=0。

    这是我在Vista上尝试的。

    我想我需要在使用OpenProcess之前启用SeDebugPrivilege。 但是为了启用SeDebugPrivilege,我需要得到它的进程句柄。

    5 回复  |  直到 16 年前
        1
  •  27
  •   Matt Joiner    16 年前
    OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
    

    您需要验证您使用的是有效的进程ID,并且允许您从进程请求访问权限。

        2
  •  12
  •   bdd    16 年前

    HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
    CloseHandle(processHandle); 
    

    void Loader::EnableDebugPriv(void)
    {
        HANDLE              hToken;
        LUID                SeDebugNameValue;
        TOKEN_PRIVILEGES    TokenPrivileges;
    
        if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
        {
            if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &SeDebugNameValue))
            {
                TokenPrivileges.PrivilegeCount              = 1;
                TokenPrivileges.Privileges[0].Luid          = SeDebugNameValue;
                TokenPrivileges.Privileges[0].Attributes    = SE_PRIVILEGE_ENABLED;
    
                if(AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
                {
                    CloseHandle(hToken);
                }
                else
                {
                    CloseHandle(hToken);
                    throw std::exception("Couldn't adjust token privileges!");              
                }
            }
            else
            {
                CloseHandle(hToken);
                throw std::exception("Couldn't look up privilege value!");
            }
        }
        else
        {
            throw std::exception("Couldn't open process token!");
        }
    }
    

    我在WindowsVista上成功地使用了上述代码。

        3
  •  1
  •   Community Mohan Dere    9 年前
        4
  •  1
  •   trgs    13 年前

    原来是公共语言运行时的支持设置,被设置为“纯”应该只是“普通”。我花了很长时间才找到。

    对于VS2010 C++ C++ to Project属性-gt;配置属性-gt;C/C++ + -gt;

        5
  •  0
  •   herodot    12 年前

    如果您有一个进程标识符,那么可以通过调用 功能。 允许您指定句柄的访问权限以及是否可以继承。

    仅供参考:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx