我有进程ID,我希望得到它的进程处理。
是否有可用的API。
我尝试使用OpenProcess但它返回NULL,并且GetLastError = 0。
我正在试用Vista。
我想我需要在使用OpenProcess之前启用SeDebugPrivilege。 但是为了启用SeDebugPrivilege,我需要获得它的Process句柄。
答案 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