Andrew Nguyen : taskkill: Implement forcible termination by process identifier.
Alexandre Julliard
julliard at winehq.org
Tue Sep 21 13:59:29 CDT 2010
Module: wine
Branch: master
Commit: 6cfeeed0df3c25a44d71485ba82cf46512179dcb
URL: http://source.winehq.org/git/wine.git/?a=commit;h=6cfeeed0df3c25a44d71485ba82cf46512179dcb
Author: Andrew Nguyen <anguyen at codeweavers.com>
Date: Tue Sep 21 02:21:14 2010 -0500
taskkill: Implement forcible termination by process identifier.
---
programs/taskkill/En.rc | 2 +
programs/taskkill/taskkill.c | 53 +++++++++++++++++++++++++++++++++++++++++-
programs/taskkill/taskkill.h | 6 +++-
3 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/programs/taskkill/En.rc b/programs/taskkill/En.rc
index a37321d..724f907 100644
--- a/programs/taskkill/En.rc
+++ b/programs/taskkill/En.rc
@@ -33,6 +33,8 @@ STRINGTABLE
STRING_MUTUAL_EXCLUSIVE, "Error: Options /im and /pid are mutually exclusive.\n"
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_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 f24883b..d864e60 100644
--- a/programs/taskkill/taskkill.c
+++ b/programs/taskkill/taskkill.c
@@ -278,6 +278,57 @@ static int send_close_messages(void)
return status_code;
}
+static int terminate_processes(void)
+{
+ unsigned int i;
+ int status_code = 0;
+
+ for (i = 0; i < task_count; i++)
+ {
+ WCHAR *p = task_list[i];
+ BOOL is_numeric = TRUE;
+
+ /* Determine whether the string is not numeric. */
+ while (*p)
+ {
+ if (!isdigitW(*p++))
+ {
+ is_numeric = FALSE;
+ break;
+ }
+ }
+
+ if (is_numeric)
+ {
+ DWORD pid = atoiW(task_list[i]);
+ HANDLE process;
+
+ process = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
+ 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;
+ }
+
+ taskkill_message_printfW(STRING_TERM_PID_SEARCH, pid);
+ CloseHandle(process);
+ }
+ else
+ WINE_FIXME("Forcible process termination by name is not implemented\n");
+ }
+
+ return status_code;
+}
+
static BOOL add_to_task_list(WCHAR *name)
{
static unsigned int list_size = 16;
@@ -389,7 +440,7 @@ int wmain(int argc, WCHAR *argv[])
}
if (force_termination)
- WINE_FIXME("Forced termination is not implemented\n");
+ status_code = terminate_processes();
else
status_code = send_close_messages();
diff --git a/programs/taskkill/taskkill.h b/programs/taskkill/taskkill.h
index 802d523..a70cab0 100644
--- a/programs/taskkill/taskkill.h
+++ b/programs/taskkill/taskkill.h
@@ -29,5 +29,7 @@
#define STRING_MUTUAL_EXCLUSIVE 106
#define STRING_CLOSE_PID_SEARCH 107
#define STRING_CLOSE_PROC_SRCH 108
-#define STRING_SEARCH_FAILED 109
-#define STRING_ENUM_FAILED 110
+#define STRING_TERM_PID_SEARCH 109
+#define STRING_SEARCH_FAILED 110
+#define STRING_ENUM_FAILED 111
+#define STRING_TERMINATE_FAILED 112
More information about the wine-cvs
mailing list