【问题标题】:how to get process handle from process id?如何从进程ID获取进程句柄?
【发布时间】:2013-11-27 10:37:49
【问题描述】:

我有进程 ID,我想获取它的进程句柄。

是否有任何可用的 API。

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

这是我在 Vista 上尝试的。

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

【问题讨论】:

  • 你能描述一下你为什么需要这个吗?
  • 我为你添加了调试权限代码

标签: c++ winapi windows-vista


【解决方案1】:
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);

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

【讨论】:

  • 不要要求 PROCESS_ALL_ACCESS,您不太可能在安全安装中获得它。只问你需要什么。
  • 对,尝试请求 SYNCHRONIZE,它几乎永远不会失败。然后从那里加强请求的权限。
  • @Matt Joiner:我如何在 KMDF 中使用 DDK 做到这一点??
【解决方案2】:

这是你要找的吗?

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

另外,这是我在注入 DLL 之前用来设置调试权限的一些代码。

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 上使用了上述代码。

【讨论】:

  • 这将返回 Window Handle ,而不是 Process Handle 我正在从 Process ID 寻找 Process Handle
【解决方案3】:

您需要提升权限。另请查看类似问题here

【讨论】:

    【解决方案4】:

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

    对于VS2010 c++ goto -> Project Properties -> Configuration Properties -> C/C++ -> General

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2010-12-25
        • 1970-01-01
        • 2023-01-26
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        • 1970-01-01
        相关资源
        最近更新 更多