как получить дескриптор процесса из идентификатора процесса? - PullRequest
20 голосов
/ 08 февраля 2010

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

Для этого есть какой-либо API.

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

Это я пытаюсь на Vista.

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

Ответы [ 5 ]

25 голосов
/ 08 февраля 2010
OpenProcess(PROCESS_ALL_ACCESS, TRUE, procId);

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

11 голосов
/ 08 февраля 2010

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

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.

1 голос
/ 22 мая 2013

У меня точно такая же проблема, как описано: OpenProcess () == NULL и GetLastError () == 0. Оказалось, что параметр поддержки Common Language RunTime, был установлен на «Pure» должен был быть просто «Common». Мне потребовались годы, чтобы найти.

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

1 голос
/ 08 февраля 2010

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

0 голосов
/ 27 ноября 2013

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

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

...