Подтвердить что ты не робот

Как получить дескриптор процесса из идентификатора процесса?

У меня есть идентификатор процесса, я хочу получить его дескриптор процесса.

Есть ли для этого API.

Я попытался использовать OpenProcess, но он возвращает NULL, а GetLastError = 0.

Это я использую Vista.

Я думаю, мне нужно включить SeDebugPrivilege перед использованием OpenProcess. Но для включения SeDebugPrivilege мне нужно получить свой дескриптор процесса.

4b9b3361

Ответ 1

OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);

Вам нужно будет убедиться, что вы используете действительный идентификатор процесса, и что вы разрешаете права доступа, которые вы запрашиваете от процесса.

Ответ 2

Это то, что вы ищете?

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

Кроме того, вот некоторый код, который я использую для установки debug 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.

Ответ 3

Вам нужны повышенные привилегии. Также посмотрите на аналогичный вопрос здесь.

Ответ 4

У меня была точно такая же проблема, как описано: OpenProcess() == NULL и GetLastError() == 0. Выключенный в качестве параметра поддержки Common Language RunTime, был установлен в "Pure", должен был быть просто "общим". Принял меня, чтобы найти.

Для VS2010 С++ goto → Свойства проекта → Свойства конфигурации → C/С++ → Общие

Ответ 5

Если у вас есть идентификатор процесса, вы можете получить дескриптор процесса, вызвав функцию OpenProcess. OpenProcess позволяет вам указать права доступа к дескриптору и может ли он быть унаследован.

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