Program C WinAPI sederhana untuk menghentikan proses melalui nama gambar proses

Aug 20 2020

(Juga, lihat iterasi berikutnya .)

Saya memiliki program kecil ini untuk menghentikan proses melalui masing-masing nama gambar proses ( .exefile):

#include <stdio.h>
#include <windows.h>
#include <TlHelp32.h>

int main(int argc, char* argv[]) {
    if (argc != 2) {
        puts("processkiller.exe PROCESS_NAME");
        return EXIT_SUCCESS;
    }

    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);

    if (Process32First(snapshot, &entry) == TRUE) {
        while (Process32Next(snapshot, &entry) == TRUE) {
            if (strcmp(entry.szExeFile, argv[1]) == 0) {
                HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 
                                              FALSE, 
                                              entry.th32ProcessID);
                TerminateProcess(hProcess, 0);
                CloseHandle(hProcess);
            }
        }
    }

    CloseHandle(snapshot);
    return EXIT_SUCCESS;
}

Perhatikan bahwa Anda perlu menjalankan processkiller.exedalam mode administrator untuk benar-benar menghentikan proses yang diminta.

Permintaan kritik

Tolong beritahu saya apapun yang terlintas dalam pikiran saya.

Jawaban

4 MartinR Aug 20 2020 at 19:37

Ada bug halus:

Process32First(snapshot, &entry)

sudah terisi entrydengan informasi tentang proses pertama dalam snapshot. Kode Anda melewatkan entri itu karena Process32Next()dipanggil segera. Struktur lingkaran seharusnya

if (Process32First(snapshot, &entry) == TRUE) {
    do {
        // ... do something with `entry`...
        
    } while (Process32Next(snapshot, &entry) == TRUE);
}

sebagai gantinya. Hal lain yang muncul di benak saya:

  • Jika program dipanggil dengan jumlah argumen yang salah maka pesan kesalahan / penggunaan harus dicetak ke kesalahan standar dan program harus diakhiri dengan kode keluar bukan nol , misalnya EXIT_FAILURE.
  • Nilai kembalian CreateToolhelp32Snapshot()tidak dicentang.
  • PROCESS_ALL_ACCESStidak diperlukan dalam panggilan ke OpenProcess, hanya PROCESS_TERMINATE.
  • Nilai kembalian OpenProcess()dan TerminateProcess()tidak dicentang. Saya mengharapkan pesan diagnostik jika gagal. Secara khusus, TerminateProcess()dan CloseHandle()hanya boleh dipanggil jika OpenProcess()berhasil.
  • Ini mungkin masalah selera, tapi == TRUEbisa dihilangkan saat memeriksa kondisi boolean.
  • Sebagai pengguna alat ini, saya mengharapkan beberapa umpan balik untuk melihat apakah proses pencocokan ditemukan, dan berapa banyak proses yang mati.