我有进程ID,想要获取它的进程句柄。
是否有可用的API进行操作?
我尝试使用OpenProcess,但它返回NULL,GetLastError=0。
我在Vista上尝试了这个方法。
我猜我需要在使用OpenProcess之前启用SeDebugPrivilege。
但是要启用SeDebugPrivilege,我需要获取其进程句柄。
我有进程ID,想要获取它的进程句柄。
是否有可用的API进行操作?
我尝试使用OpenProcess,但它返回NULL,GetLastError=0。
我在Vista上尝试了这个方法。
我猜我需要在使用OpenProcess之前启用SeDebugPrivilege。
但是要启用SeDebugPrivilege,我需要获取其进程句柄。
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
您需要验证您正在使用有效的进程ID,并且您被允许从该进程请求所需的访问权限。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!");
}
}
FYI:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684868(v=vs.85).aspx