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