From a7431fe90fa82ab3313b582aeb2c6af7cbf9de36 Mon Sep 17 00:00:00 2001 From: Andrew Nguyen Date: Tue, 21 Sep 2010 02:21:23 -0500 Subject: [PATCH] taskkill: Implement forcible termination by process name. --- programs/taskkill/En.rc | 1 + programs/taskkill/taskkill.c | 51 +++++++++++++++++++++++++++++++++++- programs/taskkill/taskkill.h | 7 ++--- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/programs/taskkill/En.rc b/programs/taskkill/En.rc index 724f9072a1c..f7fcfd6e36b 100644 --- a/programs/taskkill/En.rc +++ b/programs/taskkill/En.rc @@ -34,6 +34,7 @@ STRINGTABLE STRING_CLOSE_PID_SEARCH, "Close message sent to top-level windows of process with PID %u.\n" STRING_CLOSE_PROC_SRCH, "Close message sent to top-level windows of process \"%s\" with PID %u.\n" STRING_TERM_PID_SEARCH, "Process with PID %u was forcibly terminated.\n" + STRING_TERM_PROC_SEARCH, "Process \"%s\" with PID %u was forcibly terminated.\n" STRING_SEARCH_FAILED, "Error: Could not find process \"%s\".\n" STRING_ENUM_FAILED, "Error: Unable to enumerate the process list.\n" STRING_TERMINATE_FAILED, "Error: Unable to terminate process \"%s\".\n" diff --git a/programs/taskkill/taskkill.c b/programs/taskkill/taskkill.c index d864e60b652..c3080e57461 100644 --- a/programs/taskkill/taskkill.c +++ b/programs/taskkill/taskkill.c @@ -280,9 +280,17 @@ static int send_close_messages(void) static int terminate_processes(void) { + DWORD *pid_list, pid_list_size; unsigned int i; int status_code = 0; + pid_list = enumerate_processes(&pid_list_size); + if (!pid_list) + { + taskkill_message(STRING_ENUM_FAILED); + return 1; + } + for (i = 0; i < task_count; i++) { WCHAR *p = task_list[i]; @@ -323,9 +331,50 @@ static int terminate_processes(void) CloseHandle(process); } else - WINE_FIXME("Forcible process termination by name is not implemented\n"); + { + DWORD index; + BOOL found_process = FALSE; + + for (index = 0; index < pid_list_size; index++) + { + WCHAR process_name[MAX_PATH]; + + if (get_process_name_from_pid(pid_list[index], process_name, MAX_PATH) && + !strcmpiW(process_name, task_list[i])) + { + HANDLE process; + + process = OpenProcess(PROCESS_TERMINATE, FALSE, pid_list[index]); + if (!process) + { + taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); + status_code = 128; + continue; + } + + if (!TerminateProcess(process, 0)) + { + taskkill_message_printfW(STRING_TERMINATE_FAILED, task_list[i]); + status_code = 1; + CloseHandle(process); + continue; + } + + found_process = TRUE; + taskkill_message_printfW(STRING_TERM_PROC_SEARCH, task_list[i], pid_list[index]); + CloseHandle(process); + } + } + + if (!found_process) + { + taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]); + status_code = 128; + } + } } + HeapFree(GetProcessHeap(), 0, pid_list); return status_code; } diff --git a/programs/taskkill/taskkill.h b/programs/taskkill/taskkill.h index a70cab0b0e2..e535a01d2e7 100644 --- a/programs/taskkill/taskkill.h +++ b/programs/taskkill/taskkill.h @@ -30,6 +30,7 @@ #define STRING_CLOSE_PID_SEARCH 107 #define STRING_CLOSE_PROC_SRCH 108 #define STRING_TERM_PID_SEARCH 109 -#define STRING_SEARCH_FAILED 110 -#define STRING_ENUM_FAILED 111 -#define STRING_TERMINATE_FAILED 112 +#define STRING_TERM_PROC_SEARCH 110 +#define STRING_SEARCH_FAILED 111 +#define STRING_ENUM_FAILED 112 +#define STRING_TERMINATE_FAILED 113