Maison > développement back-end > C++ > le corps du texte

Comment puis-je récupérer un handle de processus par son nom en C ?

Susan Sarandon
Libérer: 2024-11-20 18:25:15
original
511 Les gens l'ont consulté

How Can I Retrieve a Process Handle by Name in C  ?

Récupération du processus géré par son nom en C

En C , vous pouvez rencontrer des situations où vous devez manipuler un processus en fonction de son nom. Par exemple, vous souhaiterez peut-être mettre fin à un processus appelé « exemple.exe » sans vous fier aux handles de fenêtre. Cette question approfondit ce scénario spécifique et présente une solution.

Pour récupérer le descripteur de processus par son nom, nous pouvons exploiter les fonctions de l'API Windows CreateToolhelp32Snapshot et Process32Next. Voici un extrait de code qui illustre cette approche :

#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>

int main() {
  // Create a snapshot of running processes
  HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  // Iterate over the processes
  PROCESSENTRY32 entry;
  entry.dwSize = sizeof(PROCESSENTRY32);
  if (Process32First(snapshot, &entry) == TRUE) {
    while (Process32Next(snapshot, &entry) == TRUE) {
      // Check if this is the process we want
      if (strcmp(entry.szExeFile, "example.exe") == 0) {
        // Open a handle to the process
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
        // Perform desired operations on the process
        CloseHandle(hProcess);  // Close the handle
      }
    }
  }

  CloseHandle(snapshot);  // Close the snapshot handle
  return 0;
}
Copier après la connexion

Cette solution parcourra tous les processus en cours d'exécution et comparera leurs noms d'exécutables avec "example.exe". Une fois qu'une correspondance est trouvée, un handle vers ce processus est obtenu et peut être utilisé pour effectuer des opérations telles que la résiliation (via TerminateProcess).

Remarque : Si vous prévoyez d'utiliser PROCESS_ALL_ACCESS dans OpenProcess , vous devrez peut-être élever les privilèges de votre processus en activant le privilège SE_DEBUG_NAME. Le code pour ce faire est affiché ci-dessous :

void EnableDebugPriv() {
  // Enable debug privilege
  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);
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal