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

Comment obtenir un handle de processus en C par son nom ?

Patricia Arquette
Libérer: 2024-11-24 05:40:09
original
615 Les gens l'ont consulté

How to Get a Process Handle in C   by its Name?

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;
}
Copier après la connexion

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;
}
Copier après la connexion

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!

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