У меня есть идентификатор процесса, я хочу получить его дескриптор процесса.
Есть ли любой API, доступный для этого.
Я пытался использовать OpenProcess, но он возвращает ПУСТОЙ УКАЗАТЕЛЬ и GetLastError =0.
Это я примеряю Vista.
Я предполагаю, что должен включить SeDebugPrivilege перед использованием OpenProcess. Но для включения SeDebugPrivilege я должен получить его дескриптор Процесса.
Это то, что вы ищете?
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.
Вам потребуются повышенные привилегии. Также посмотрите аналогичный вопрос здесь .
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);
Вам нужно будет убедиться, что вы используете действительный идентификатор процесса и что вам предоставлены права доступа, которые вы запрашиваете у процесса.