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 ( .exe
file):
#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.exe
in 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à entry
con 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_ACCESS
non è necessario nella chiamata aOpenProcess
, soloPROCESS_TERMINATE
.- I valori restituiti di
OpenProcess()
eTerminateProcess()
non vengono controllati. Mi aspetto un messaggio diagnostico se falliscono. In particolare,TerminateProcess()
eCloseHandle()
dovrebbe essere chiamato solo in caso diOpenProcess()
successo. - Può essere una questione di gusti, ma
== TRUE
può 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.