Module: wine Branch: master Commit: a7431fe90fa82ab3313b582aeb2c6af7cbf9de36 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a7431fe90fa82ab3313b582aeb...
Author: Andrew Nguyen anguyen@codeweavers.com Date: Tue Sep 21 02:21:23 2010 -0500
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 724f907..f7fcfd6 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 d864e60..c3080e5 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 a70cab0..e535a01 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