Получить дескриптор процесса по имени изображения - PullRequest
1 голос
/ 17 февраля 2010

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

Процесс, который я ищу, не имеет зарегистрированных классов окон. Я также знаю, что если он запущен, то будет запущен только один его экземпляр.

1 Ответ

2 голосов
/ 17 февраля 2010

Используйте CreateToolhelp32Snapshot , Process32First и Process32Next для перечисления всех процессов.

Внутри PROCESSENTRY32 вы можете найти szExeFile члена. Вы можете получить дескриптор процесса, вызвав OpenProcess с идентификатором процесса th32ProcessID в той же структуре.

Как только вы найдете процесс, соответствующий вашему exe-имени, вы можете выйти из цикла и получить дескриптор.

Примечание. Если вам нужно перечислить КАЖДЫЙ процесс независимо от того, что это за сеанс, вы должны получить привилегию SE_DEBUG.

В верхней части вашего основного вызова это:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege

А вот определение acquirePrivilegeByName:

BOOL acquirePrivilegeByName(
                            const TCHAR     *szPrivilegeName)
{
    HANDLE          htoken;
    TOKEN_PRIVILEGES    tkp;
    DWORD           dwerr;

    if (szPrivilegeName == NULL)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
        return FALSE;

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
        return FALSE;

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
        GetLastError() != ERROR_SUCCESS)    // may equal ERROR_NOT_ALL_ASSIGNED
    {
        dwerr = GetLastError();
        CloseHandle(htoken);
        SetLastError(dwerr);
        return FALSE;
    }

    CloseHandle(htoken);
    SetLastError(ERROR_SUCCESS);

    return TRUE;
} //acquirePrivilegeByName()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...