Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mendapatkan Pengendalian Proses dalam C dengan Namanya?

Bagaimana untuk Mendapatkan Pengendalian Proses dalam C dengan Namanya?

Patricia Arquette
Patricia Arquetteasal
2024-11-24 05:40:09618semak imbas

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

Mencari Proses mengikut Nama dan Mendapatkan Kembali Pemegangnya dalam C

Dalam banyak kes, mengetahui nama proses dan mendapatkan semula pemegangnya adalah penting untuk mengawal dan berinteraksi dengan tertentu menjalankan aplikasi. Ini menjadi lebih penting apabila berurusan dengan proses yang tidak mempunyai antara muka grafik dan tidak dapat dikesan menggunakan teknik berasaskan tetingkap. Dalam senario sedemikian, keupayaan untuk mendapatkan semula pemegang proses dengan namanya membenarkan manipulasi langsung dan kawalan aplikasi ini.

Untuk mencapai ini dalam C , anda boleh menggunakan penyelesaian berikut:

#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;
}

Kod ini mendapatkan semula pemegang proses yang diberikan nama fail boleh lakunya. Ia memanfaatkan fungsi CreateToolhelp32Snapshot dan Process32Next daripada perpustakaan tlhelp32 untuk menghitung dan mencari melalui proses yang sedang berjalan. Setelah mengesan proses sasaran dengan membandingkan nama boleh lakunya, ia menggunakan OpenProcess untuk mendapatkan pengendalian proses.

Walau bagaimanapun, jika anda memerlukan akses kepada proses menggunakan PROCESS_ALL_ACCESS, anda mungkin menghadapi masalah penafian akses. Untuk menyelesaikan masalah ini, anda perlu mendayakan keistimewaan SeDebugPrivilege, yang boleh dilakukan melalui panggilan API AdjustTokenPrivileges. Berikut ialah kod yang diubah suai yang menggabungkan langkah-langkah yang diperlukan:

#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;
}

Dengan menggabungkan pendekatan ini, anda boleh mendapatkan semula pengendalian proses dengan berkesan dengan namanya dan memanipulasi proses walaupun tanpa antara muka grafik.

Atas ialah kandungan terperinci Bagaimana untuk Mendapatkan Pengendalian Proses dalam C dengan Namanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn