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

Как я могу получить дескриптор процесса по его имени в С++?

Я пытаюсь получить дескриптор процесса, например example.exe, поэтому я могу называть его TerminateProcess. Как я могу это сделать? Обратите внимание, что у него нет окна, поэтому FindWindow не будет работать.

4b9b3361

Ответ 1

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

int main( int, char *[] )
{
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (stricmp(entry.szExeFile, "target.exe") == 0)
            {  
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);

                // Do stuff..

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

    return 0;
}

Кроме того, если вы хотите использовать PROCESS_ALL_ACCESS в OpenProcess, вы можете попробовать следующее:

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

void EnableDebugPriv()
{
    HANDLE hToken;
    LUID luid;
    TOKEN_PRIVILEGES tkp;

    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);

    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);

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

    AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);

    CloseHandle(hToken); 
}

int main( int, char *[] )
{
    EnableDebugPriv();

    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE)
    {
        while (Process32Next(snapshot, &entry) == TRUE)
        {
            if (stricmp(entry.szExeFile, "target.exe") == 0)
            {  
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);

                // Do stuff..

                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);

    return 0;
}

Ответ 2

Следующий код показывает, как вы можете использовать toolhelp и OpenProcess, чтобы получить дескриптор процесса. Обработка ошибок удалена для краткости.

HANDLE GetProcessByName(PCSTR name)
{
    DWORD pid = 0;

    // Create toolhelp snapshot.
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 process;
    ZeroMemory(&process, sizeof(process));
    process.dwSize = sizeof(process);

    // Walkthrough all processes.
    if (Process32First(snapshot, &process))
    {
        do
        {
            // Compare process.szExeFile based on format of name, i.e., trim file path
            // trim .exe if necessary, etc.
            if (string(process.szExeFile) == string(name))
            {
               pid = process.th32ProcessID;
               break;
            }
        } while (Process32Next(snapshot, &process));
    }

    CloseHandle(snapshot);

    if (pid != 0)
    {
         return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    }

    // Not found


       return NULL;
}

Ответ 3

Существует два основных метода. Первый использует PSAPI; В MSDN пример, который использует EnumProcesses, OpenProcess, EnumProcessModules и GetModuleBaseName.

Другой использует Toolhelp, который я предпочитаю. Используйте CreateToolhelp32Snapshot, чтобы получить снимок списка процессов, пройдите по нему с помощью Process32First и Process32Next, который предоставляет имя модуля и идентификатор процесса, пока не найдете тот, который вы хотите, а затем вызовите OpenProcess, чтобы получить дескриптор.

Ответ 4

Отъезд: Статья MSDN

Вы можете использовать GetModuleName (я думаю?), чтобы получить имя и проверить на это.

Ответ 5

OpenProcess Функция

Из MSDN:

Чтобы открыть дескриптор другого локального процесса и получить права полного доступа, вы должны включить привилегию SeDebugPrivilege.