Comment puis-je obtenir un descripteur de processus par son nom en C ++?

J’essaie d’obtenir le handle de processus, disons exemple.exe, afin que je puisse appeler TerminateProcess sur elle. Comment puis-je faire ceci? Notez qu’il n’a pas de fenêtre donc FindWindow ne fonctionnera pas.

 #include  #include  #include  int main( int, char *[] ) { PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { if (ssortingcmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff.. CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; } 

En outre, si vous souhaitez utiliser PROCESS_ALL_ACCESS dans OpenProcess, vous pouvez essayer ceci:

 #include  #include  #include  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].Atsortingbutes = 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 (ssortingcmp(entry.szExeFile, "target.exe") == 0) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Do stuff.. CloseHandle(hProcess); } } } CloseHandle(snapshot); return 0; } 

Le code suivant montre comment utiliser toolhelp et OpenProcess pour gérer le processus. La gestion des erreurs a été supprimée pour des raisons de concision.

 HANDLE GetProcessByName(PCSTR name) { DWORD pid = 0; // Create toolhelp snapshot. HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 process; ZeroMemory(&process, sizeof(process)); process.dwSize = sizeof(process); // Walkthrough all processes. if (Process32First(snapshot, &process)) { do { // Compare process.szExeFile based on format of name, ie, sortingm file path // sortingm .exe if necessary, etc. if (ssortingng(process.szExeFile) == ssortingng(name)) { pid = process.th32ProcessID; break; } } while (Process32Next(snapshot, &process)); } CloseHandle(snapshot); if (pid != 0) { return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); } // Not found return NULL; } 

Il existe deux techniques de base. Le premier utilise PSAPI; MSDN a un exemple qui utilise EnumProcesses , OpenProcess , EnumProcessModules et GetModuleBaseName .

L’autre utilise Toolhelp, que je préfère. Utilisez CreateToolhelp32Snapshot pour obtenir un instantané de la liste des processus, parcourez-le avec Process32First et Process32Next , qui fournissent le nom du module et l’ID du processus, jusqu’à ce que vous trouviez celui que vous souhaitez, puis appelez OpenProcess pour obtenir un handle.

Check out: Article MSDN

Vous pouvez utiliser GetModuleName (je pense?) Pour obtenir le nom et vérifier cela.

Fonction OpenProcess

De MSDN:

Pour ouvrir un handle vers un autre processus local et obtenir des droits d’access complets, vous devez activer le privilège SeDebugPrivilege.