Get a process ID in C by name

12,956

The solution is to simply set the pe32.dwSize after getting the process snapshot. Complete fixed code here:

DWORD FindProcessId(const char *processname)
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    DWORD result = NULL;

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

    pe32.dwSize = sizeof(PROCESSENTRY32); // <----- IMPORTANT

    // Retrieve information about the first process,
    // and exit if unsuccessful
    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);          // clean the snapshot object
        printf("!!! Failed to gather information on system processes! \n");
        return(NULL);
    }

    do
    {
        printf("Checking process %ls\n", pe32.szExeFile);
        if (0 == strcmp(processname, pe32.szExeFile))
        {
            result = pe32.th32ProcessID;
            break;
        }
    } while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);

    return result;
}
Share:
12,956
Christian Stewart
Author by

Christian Stewart

Updated on June 14, 2022

Comments

  • Christian Stewart
    Christian Stewart almost 2 years

    I'm trying to get a process ID by a process name (for example, notepad.exe), but previous solutions on Stack Overflow don't seem to work properly. Here is what I've tried:

    DWORD FindProcessId(const char *processname)
    {
        HANDLE hProcessSnap;
        PROCESSENTRY32 pe32;
        DWORD result = NULL;
    
        // 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 == _stricmp(processname, pe32.szExeFile))
            {
                result = pe32.th32ProcessID;
                break;
            }
        } while (Process32Next(hProcessSnap, &pe32));
    
        CloseHandle(hProcessSnap);
    
        return result;
    }
    

    I pass in "notepad.exe" and confirm that it is running on my system, and that the application is running as Administrator with the correct privileges required. Elevation is done like this:

            if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
            {
                // Launch itself as administrator.
                sei.lpVerb = TEXT("runas");
                sei.lpFile = szPath;
                sei.hwnd = NULL;
                sei.nShow = SW_NORMAL;
    
                if (!ShellExecuteEx(&sei))
                {
                    MessageBox(NULL, TEXT("The program needs to be elevated to work properly."), APP_TITLE, MB_OK);
                    return -1;
                }
            }
            return 0;
    

    It never finds the process ID - returns Null every time.

    This is using C, not C++.