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

时间:2010-02-08 11:07:31

标签: c++ winapi windows-vista

我有进程ID,我希望得到它的进程处理。

是否有可用的API。

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

我正在试用Vista。

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

5 个答案:

答案 0 :(得分:25)

OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);

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

答案 1 :(得分:11)

这是你在找什么?

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

此外,这里有一些代码用于在注入DLL之前设置debug privledge。

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!");
    }
}

我已经在Windows Vista上成功使用了上述代码。

答案 2 :(得分:1)

您需要提升权限。另请参阅类似问题here

答案 3 :(得分:1)

我刚才遇到了与上述完全相同的问题:OpenProcess()== NULL和GetLastError()== 0。 原来是Common Language RunTime支持设置,被设置为“Pure”应该只是“Common”。花了我很多年才找到。

对于VS2010 c ++ goto - >项目属性 - >配置属性 - > C / C ++ - >一般

答案 4 :(得分:0)

  

如果您有进程标识符,则可以通过调用 OpenProcess 函数来获取进程句柄。 OpenProcess 使您可以指定句柄的访问权限以及是否可以继承。

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