To retrieve the handle of a process by its name, we can leverage the CreateToolhelp32Snapshot function to obtain a snapshot of the system's processes. This function provides access to information about running processes, including their process names.
The following code snippet demonstrates how to use CreateToolhelp32Snapshot and Process32Next to search for a process by name and retrieve its handle:
#include <cstdio> #include <windows.h> #include <tlhelp32.h> int main(int, char *[]) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 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 with the process... CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
If you require PROCESS_ALL_ACCESS access, you may need to temporarily enable the SE_DEBUG_NAME privilege. Here's how you can do that:
#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(); // ... (Code from previous example)... return 0; }
The above is the detailed content of How to Retrieve a Process Handle by its Name in C ?. For more information, please follow other related articles on the PHP Chinese website!