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;
}
Author by
Christian Stewart
Updated on June 14, 2022Comments
-
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++.