我有进程ID,我想获得它的进程句柄。如何从进程ID获取进程句柄?
有没有可用的API。
我试图使用OpenProcess,但它返回NULL,并GetLastError = 0。
这我试图在Vista上。
我想我需要在使用OpenProcess之前启用SeDebugPrivilege。 但为了启用SeDebugPrivilege,我需要获取它的进程句柄。
我有进程ID,我想获得它的进程句柄。如何从进程ID获取进程句柄?
有没有可用的API。
我试图使用OpenProcess,但它返回NULL,并GetLastError = 0。
这我试图在Vista上。
我想我需要在使用OpenProcess之前启用SeDebugPrivilege。 但为了启用SeDebugPrivilege,我需要获取它的进程句柄。
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
您需要验证您是否使用了有效的进程ID,并且允许您从进程请求的访问权限。
procId有效。 – anand 2010-02-08 11:14:04
不要求PROCESS_ALL_ACCESS,你不太可能在安全的安装中获得。只问你需要什么。 – 2010-02-08 13:38:10
对,试着要求SYNCHRONIZE,它几乎不会失败。然后从那里提高请求的许可。 – 2010-02-08 19:12:17
这是你在找什么?
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
CloseHandle(processHandle);
此外,这里是一些代码,我用于设置调试privledge在注入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上成功使用了上述代码。
您需要提升的权限。也看类似的问题here。
我刚刚遇到了与上述完全相同的问题:OpenProcess()== NULL和GetLastError()== 0. 原来是Common Language RunTime Support设置,被设置为“Pure”应该只是“共同”。花了我很长时间才发现。
对于VS2010 C++转到 - >项目属性 - >配置属性 - > C/C++ - >常规
如果你有一个进程标识符,您可以通过调用OpenProcess函数来获取进程句柄。 OpenProcess使您能够指定句柄的访问权限以及它是否可以继承。
FYI:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx
你能描述你为什么需要这个? – dirkgently 2010-02-08 11:11:49
我已经为ya添加了调试权限代码 – bdd 2010-02-08 12:46:27