https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a5d599505d51504e973c537fada60580557716b5

commit a5d599505d51504e973c537fada60580557716b5
Author:     Hermès Bélusca-Maïto <[email protected]>
AuthorDate: Fri Apr 3 18:40:00 2020 +0200
Commit:     Hermès Bélusca-Maïto <[email protected]>
CommitDate: Fri Apr 3 18:40:00 2020 +0200

    [TASKKILL] Merge our updated terminate_processes() function with the one
    from Wine, using __REACTOS__ defines to separate the changes.
    
    We note that in effect it completely contains the functionality of
    Wine's send_close_messages(), so we keep that latter disabled.
---
 base/applications/cmdutils/taskkill/taskkill.c | 205 +++++++------------------
 1 file changed, 52 insertions(+), 153 deletions(-)

diff --git a/base/applications/cmdutils/taskkill/taskkill.c 
b/base/applications/cmdutils/taskkill/taskkill.c
index b78d461a6fa..75706a66491 100644
--- a/base/applications/cmdutils/taskkill/taskkill.c
+++ b/base/applications/cmdutils/taskkill/taskkill.c
@@ -3,6 +3,7 @@
  *
  * Copyright 2008 Andrew Riedi
  * Copyright 2010 Andrew Nguyen
+ * Copyright 2020 He Yang
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -52,7 +53,7 @@ static PWCHAR opList[] = {opForceTerminate, opImage, opPID, 
opHelp, opTerminateC
 #define OP_PARAM_HELP 3
 #define OP_PARAM_TERMINATE_CHILD 4
 
-#endif
+#endif // __REACTOS__
 
 struct pid_close_info
 {
@@ -229,151 +230,7 @@ static BOOL get_process_name_from_pid(DWORD pid, WCHAR 
*buf, DWORD chars)
  * A PID of zero causes taskkill to warn about the inability to terminate
  * system processes. */
 
-
-#ifdef __REACTOS__
-
-static int terminate_processes(BOOL force_termination)
-{
-    DWORD *pid_list, pid_list_size;
-    DWORD self_pid = GetCurrentProcessId();
-    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];
-        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]);
-
-            if (pid == self_pid)
-            {
-                taskkill_message(STRING_SELF_TERMINATION);
-                status_code = 1;
-                continue;
-            }
-
-            if (force_termination)
-            {
-                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
-            {
-                struct pid_close_info info = {pid};
-
-                EnumWindows(pid_enum_proc, (LPARAM)&info);
-                if (info.found)
-                    taskkill_message_printfW(STRING_CLOSE_PID_SEARCH, pid);
-                else
-                {
-                    taskkill_message_printfW(STRING_SEARCH_FAILED, 
task_list[i]);
-                    status_code = 128;
-                }
-            }
-        }
-        else
-        {
-            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]))
-                {
-                    found_process = TRUE;
-
-                    if (pid_list[index] == self_pid)
-                    {
-                        taskkill_message(STRING_SELF_TERMINATION);
-                        status_code = 1;
-                        continue;
-                    }
-
-                    if (force_termination)
-                    {
-                        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;
-                        }
-
-                        taskkill_message_printfW(STRING_TERM_PROC_SEARCH, 
task_list[i], pid_list[index]);
-                        CloseHandle(process);
-                    }
-                    else
-                    {
-                        struct pid_close_info info = {pid_list[index]};
-                        EnumWindows(pid_enum_proc, (LPARAM)&info);
-                        taskkill_message_printfW(STRING_CLOSE_PROC_SRCH, 
process_name, pid_list[index]);
-                    }
-                }
-            }
-
-            if (!found_process)
-            {
-                taskkill_message_printfW(STRING_SEARCH_FAILED, task_list[i]);
-                status_code = 128;
-            }
-        }
-    }
-
-    HeapFree(GetProcessHeap(), 0, pid_list);
-    return status_code;
-}
-
-#else
+#ifndef __REACTOS__
 
 static int send_close_messages(void)
 {
@@ -464,7 +321,13 @@ static int send_close_messages(void)
     return status_code;
 }
 
+#endif // __REACTOS__
+
+#ifdef __REACTOS__
+static int terminate_processes(BOOL force_termination)
+#else
 static int terminate_processes(void)
+#endif
 {
     DWORD *pid_list, pid_list_size;
     DWORD self_pid = GetCurrentProcessId();
@@ -496,7 +359,9 @@ static int terminate_processes(void)
         if (is_numeric)
         {
             DWORD pid = atoiW(task_list[i]);
+#ifndef __REACTOS__
             HANDLE process;
+#endif
 
             if (pid == self_pid)
             {
@@ -505,6 +370,11 @@ static int terminate_processes(void)
                 continue;
             }
 
+#ifdef __REACTOS__
+            if (force_termination)
+            {
+            HANDLE process;
+#endif
             process = OpenProcess(PROCESS_TERMINATE, FALSE, pid);
             if (!process)
             {
@@ -523,6 +393,22 @@ static int terminate_processes(void)
 
             taskkill_message_printfW(STRING_TERM_PID_SEARCH, pid);
             CloseHandle(process);
+#ifdef __REACTOS__
+            }
+            else
+            {
+                struct pid_close_info info = { pid };
+
+                EnumWindows(pid_enum_proc, (LPARAM)&info);
+                if (info.found)
+                    taskkill_message_printfW(STRING_CLOSE_PID_SEARCH, pid);
+                else
+                {
+                    taskkill_message_printfW(STRING_SEARCH_FAILED, 
task_list[i]);
+                    status_code = 128;
+                }
+            }
+#endif
         }
         else
         {
@@ -536,7 +422,11 @@ static int terminate_processes(void)
                 if (get_process_name_from_pid(pid_list[index], process_name, 
MAX_PATH) &&
                     !strcmpiW(process_name, task_list[i]))
                 {
+#ifdef __REACTOS__
+                    found_process = TRUE;
+#else
                     HANDLE process;
+#endif
 
                     if (pid_list[index] == self_pid)
                     {
@@ -545,6 +435,11 @@ static int terminate_processes(void)
                         continue;
                     }
 
+#ifdef __REACTOS__
+                    if (force_termination)
+                    {
+                    HANDLE process;
+#endif
                     process = OpenProcess(PROCESS_TERMINATE, FALSE, 
pid_list[index]);
                     if (!process)
                     {
@@ -561,9 +456,20 @@ static int terminate_processes(void)
                         continue;
                     }
 
+#ifndef __REACTOS__
                     found_process = TRUE;
+#endif
                     taskkill_message_printfW(STRING_TERM_PROC_SEARCH, 
task_list[i], pid_list[index]);
                     CloseHandle(process);
+#ifdef __REACTOS__
+                    }
+                    else
+                    {
+                        struct pid_close_info info = { pid_list[index] };
+                        EnumWindows(pid_enum_proc, (LPARAM)&info);
+                        taskkill_message_printfW(STRING_CLOSE_PROC_SRCH, 
process_name, pid_list[index]);
+                    }
+#endif
                 }
             }
 
@@ -579,9 +485,6 @@ static int terminate_processes(void)
     return status_code;
 }
 
-#endif // __REACTOS__
-
-
 static BOOL add_to_task_list(WCHAR *name)
 {
     static unsigned int list_size = 16;
@@ -849,16 +752,12 @@ int wmain(int argc, WCHAR *argv[])
     }
 
 #ifdef __REACTOS__
-
     status_code = terminate_processes(force_termination);
-    
 #else
-
     if (force_termination)
         status_code = terminate_processes();
     else
         status_code = send_close_messages();
-
 #endif
 
     HeapFree(GetProcessHeap(), 0, task_list);

Reply via email to