Rechercher un processus par son nom et récupérer son handle en C
Dans de nombreux cas, connaître le nom du processus et récupérer son handle est essentiel pour contrôler et interagir avec des applications en cours d'exécution. Cela devient plus important lorsqu'il s'agit de processus dépourvus d'interface graphique et ne pouvant pas être localisés à l'aide de techniques basées sur des fenêtres. Dans de tels scénarios, la possibilité de récupérer un descripteur de processus par son nom permet une manipulation et un contrôle directs de ces applications.
Pour y parvenir en C , vous pouvez utiliser la solution suivante :
#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... CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; }
Ce code récupère le handle d'un processus en fonction de son nom de fichier exécutable. Il exploite les fonctions CreateToolhelp32Snapshot et Process32Next de la bibliothèque tlhelp32 pour énumérer et rechercher dans les processus en cours d'exécution. Après avoir localisé le processus cible en comparant son nom d'exécutable, il utilise OpenProcess pour obtenir le descripteur du processus.
Cependant, si vous avez besoin d'accéder au processus à l'aide de PROCESS_ALL_ACCESS, vous pourriez rencontrer des problèmes d'accès refusé. Pour résoudre ce problème, vous devrez activer le privilège SeDebugPrivilege, ce qui peut être effectué via l'appel API AdjustTokenPrivileges. Voici un code modifié qui intègre les étapes nécessaires :
#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; }
En incorporant ces approches, vous pouvez récupérer efficacement un processus géré par son nom et manipuler des processus même sans interface graphique.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!