Un semplice programma C WinAPI per terminare i processi tramite i nomi delle immagini di processo

Aug 20 2020

(Inoltre, vedere la prossima iterazione .)

Ho questo piccolo programma per terminare i processi tramite i rispettivi nomi di immagine di processo ( .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;
}

Notare che è necessario eseguire processkiller.exein modalità amministratore per terminare effettivamente i processi richiesti.

Richiesta di critica

Per favore dimmi tutto quello che ti viene in mente.

Risposte

4 MartinR Aug 20 2020 at 19:37

C'è un bug sottile:

Process32First(snapshot, &entry)

riempie già entrycon le informazioni sul primo processo nell'istantanea. Il tuo codice manca quella voce perché Process32Next()viene chiamato immediatamente. La struttura del ciclo dovrebbe essere

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

anziché. Altre cose che mi vengono in mente:

  • Se il programma viene chiamato con un numero di argomenti errato, il messaggio di errore / utilizzo dovrebbe essere stampato sullo standard error e il programma dovrebbe terminare con un codice di uscita diverso da zero , ad es EXIT_FAILURE.
  • Il valore restituito di CreateToolhelp32Snapshot()non è verificato.
  • PROCESS_ALL_ACCESSnon è necessario nella chiamata a OpenProcess, solo PROCESS_TERMINATE.
  • I valori restituiti di OpenProcess()e TerminateProcess()non vengono controllati. Mi aspetto un messaggio diagnostico se falliscono. In particolare, TerminateProcess()e CloseHandle()dovrebbe essere chiamato solo in caso di OpenProcess()successo.
  • Può essere una questione di gusti, ma == TRUEpuò essere omesso durante il controllo di una condizione booleana.
  • Come utente di questo strumento, mi aspetto un feedback per vedere se è stato trovato un processo di corrispondenza e quanti processi sono stati interrotti.