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

Привет, я пытаюсь сделать проект, используя Windows API на языке C.Небольшая часть в моем проекте - получить идентификатор процесса lsass.exe.

Я пробовал программу ниже, но она не будет работать.Я читал о функциях CreateToolhelp32Snapshot, Process32First, Process32Next, может кто-нибудь помочь мне объяснить, как использовать их в коде.

Так что, пожалуйста, помогите мне.Я новичок в Windows API, поэтому я буду признателен, если кто-нибудь может предложить мне хорошую книгу для ссылки.

Ответы [ 4 ]

5 голосов
/ 24 декабря 2010

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

FWIW, .Net подходит к этой проблеме, предоставляя API GetProcessesByName, который возвращает коллекцию процессовобъекты.Не очень полезно для вас, конечно: - (

2 голосов
/ 24 декабря 2010

Я не знаю, для более простого способа. Это работает путем нахождения каждого запущенного PID и сравнения его имени с «lsass.exe».

    // pid.cpp : Defines the entry point for the console application.

    #include "stdafx.h"
    #include <windows.h>
    #include <psapi.h>

    int PrintProcessNameAndID( DWORD processID, const char *name )
    {
        TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");

        // Get a handle to the process.

        HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                               PROCESS_VM_READ,
                               FALSE, processID );

        // Get the process name.

        if (NULL != hProcess )
        {
            HMODULE hMod;
            DWORD cbNeeded;

            if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                 &cbNeeded) )
            {
                GetModuleBaseName( hProcess, hMod, szProcessName, 
                                   sizeof(szProcessName)/sizeof(TCHAR) );
            }
        }


        if(strcmp(szProcessName, name) == 0) // right process
        {
                    CloseHandle(hProcess);
            return 1;
        }

        // Release the handle to the process.

        CloseHandle( hProcess );
        return 0;
     }

    int find(const char *name)
    {
    // Get the list of process identifiers.

        DWORD aProcesses[1024], cbNeeded, cProcesses;
        unsigned int i;

        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        {
            return 1;
        }


        // Calculate how many process identifiers were returned.

        cProcesses = cbNeeded / sizeof(DWORD);

        // Print the name and process identifier for each process.

        for ( i = 0; i < cProcesses; i++ )
        {
            if( aProcesses[i] != 0 )
            {
                if(PrintProcessNameAndID( aProcesses[i], name ))
                {
                    //found it
                    _tprintf("%d %s\n", aProcesses[i], name);
                }
               }
        }
 }

    int _tmain(int argc, _TCHAR* argv[])
    {
        find("lsass.exe");
        return 0;
    }
0 голосов
/ 03 сентября 2015

Это модификация кода Luis G. Costantini R..

Использует MFC:

#include "TlHelp32.h"

BOOL GetProcessList(const TCHAR *processname, CArray<DWORD> &PIDs)
{
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);

    // Take a snapshot of all processes in the system.
    HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hProcessSnap) return FALSE;

    // Retrieve information about the first process,
    // and exit if unsuccessful
    if (!::Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);          // clean the snapshot object
        return FALSE;
    }

    do
    {
        if (0 == _tcsicmp(processname, pe32.szExeFile))
        {
            PIDs.Add(pe32.th32ProcessID);
        }
    }
    while (::Process32Next(hProcessSnap, &pe32));

    ::CloseHandle(hProcessSnap);
    return TRUE;
}
0 голосов
/ 27 декабря 2010

Существует пример того, как использовать CreateToolhelp32Snapshot, Process32First, Process32Next (Вы должны добавить дескрипторы ошибок и т. Д. И включить tlhelp32.h в свой код). Кстати, эти функции не совместимы с Windows NT:

BOOL GetProcessList(const char *processname, DWORD **processIds, int *numprocess)
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    DWORD *processIdsTmp;

    *processIds = NULL;
    *numprocess = 0;
    // Take a snapshot of all processes in the system.
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if( INVALID_HANDLE_VALUE == hProcessSnap ) return( FALSE );

    // Retrieve information about the first process,
    // and exit if unsuccessful
    if( !Process32First( hProcessSnap, &pe32 ) )
    {
        CloseHandle( hProcessSnap );          // clean the snapshot object
        return( FALSE );
    }

    do
    {
        if (0 == strcasecmp(processname, pe32.szExeFile))
        {
            processIdsTmp = realloc(*processIds, sizeof(DWORD) * ((*numprocess) + 1));
            if (NULL == processIdsTmp)
            {
                free(*processIds);
                *processIds = NULL;
                *numprocess = 0;
                CloseHandle( hProcessSnap );          // clean the snapshot object
                return( FALSE );
            }
            *processIds = processIdsTmp;
            (*processIds)[(*numprocess)++] = pe32.th32ProcessID;
        }
    } while( Process32Next( hProcessSnap, &pe32 ) );

    CloseHandle( hProcessSnap );
    return( TRUE );     
}

здесь - полный пример использования этой функции.

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