Hi
I hope this is more readable and easier to review.

/*==========================CODE====================================*/
diff --git a/programs/taskmgr/endproc.c b/programs/taskmgr/endproc.c
index 89c2d7b..b1a9242 100644
--- a/programs/taskmgr/endproc.c
+++ b/programs/taskmgr/endproc.c
@@ -31,18 +31,26 @@
 #include "wine/unicode.h"
 #include "taskmgr.h"
 #include "perfdata.h"
+#include "tlhelp32.h" 
+
 
 static WCHAR wszWarnMsg[511];
 static WCHAR wszWarnTitle[255];
 static WCHAR wszUnable2Terminate[255];
 
+typedef struct process_list {
+    DWORD        *pid;       /*dynamic array to store the process IDs*/
+    SIZE_T      count;      /*index to maintain the last entry of the array;*/
+    SIZE_T      size;       /*the current size of the pid array*/
+} process_list;
+
 static void load_message_strings(void)
 {
     LoadStringW(hInst, IDS_TERMINATE_MESSAGE, wszWarnMsg, sizeof(wszWarnMsg)/sizeof(WCHAR));
     LoadStringW(hInst, IDS_TERMINATE_UNABLE2TERMINATE, wszUnable2Terminate, sizeof(wszUnable2Terminate)/sizeof(WCHAR));
     LoadStringW(hInst, IDS_WARNING_TITLE, wszWarnTitle, sizeof(wszWarnTitle)/sizeof(WCHAR));
 }
-
+                                                                                                                                                                                            
 void ProcessPage_OnEndProcess(void)
 {
     LVITEMW          lvitem;
@@ -93,6 +101,57 @@ void ProcessPage_OnEndProcess(void)
     CloseHandle(hProcess);
 }
 
+
+static void init_process_list(process_list *list) {
+    list->size = 4;            /*initialise size with 4. Will increase if necessary.*/
+    list->pid = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, list->size * sizeof(*(list->pid)));
+    list->count = 0;
+}
+
+static void increase_list_size(process_list *list) {
+    list->size *= 2;
+    list->pid = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, list->pid, list->size * sizeof(*(list->pid)));
+}
+
+static void process_list_append(process_list *list, DWORD id) {
+    if(list->count == list->size)
+        increase_list_size(list);
+    list->pid[list->count] = id;
+    list->count += 1;
+}
+
+static void free_process_list(process_list *list) {
+    HeapFree(GetProcessHeap(), 0, list->pid);
+}
+
+
+static void enum_process_children(HANDLE snapshot, process_list *list, DWORD pid) {
+    PROCESSENTRY32 entry;
+
+    SIZE_T start, end, i;
+
+    start = list->count;
+
+    entry.dwSize = sizeof(entry); 
+
+    if(!Process32First(snapshot, &entry))
+        return;
+
+    do 
+    {   
+        if(entry.th32ParentProcessID == pid)
+            process_list_append(list, entry.th32ProcessID);
+    } while (Process32Next(snapshot, &entry));
+
+    end = list->count;
+
+    for(i = start; i < end; ++i)
+    {
+        enum_process_children(snapshot, list, list->pid[i]);
+    }
+}
+
+
 void ProcessPage_OnEndProcessTree(void)
 {
     LVITEMW          lvitem;
@@ -100,6 +159,9 @@ void ProcessPage_OnEndProcessTree(void)
     DWORD            dwProcessId;
     HANDLE           hProcess;
     WCHAR            wstrErrorText[256];
+    process_list     list;
+    SIZE_T           i;
+    HANDLE           snapshot;
 
     load_message_strings();
 
@@ -125,20 +187,40 @@ void ProcessPage_OnEndProcessTree(void)
     if (MessageBoxW(hMainWnd, wszWarnMsg, wszWarnTitle, MB_YESNO|MB_ICONWARNING) != IDYES)
         return;
 
-    hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
 
-    if (!hProcess)
-    {
-        GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
-        MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
+    init_process_list(&list);
+
+    if(list.pid == NULL)
         return;
-    }
 
-    if (!TerminateProcess(hProcess, 0))
-    {
-        GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
-        MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
+    process_list_append(&list, dwProcessId);
+
+    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//TH32SNAPPROCESS
+
+    if(!snapshot)
+        return;
+
+    enum_process_children(snapshot, &list, dwProcessId);
+    
+    CloseHandle(snapshot);
+
+    for(i = 0; i < list.count; ++i) {
+        hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, list.pid[i]);        
+
+        if (!hProcess)
+        {
+            GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
+            MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
+            break;
+        }
+
+        if (!TerminateProcess(hProcess, 0))
+        {
+            GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
+            MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
+        }
+        CloseHandle(hProcess);
     }
 
-    CloseHandle(hProcess);
-}
+    free_process_list(&list);
+}
\ No newline at end of file


Regards
--
Akarsha Sehwag
2015010
Rang Coordinator
Adventure Club Coordinator
Sports Council | Ink member 
CSE Undergrad,  IIIT Delhi



On Thu, Apr 20, 2017 at 9:19 PM, Aaryaman Vasishta <jem456.vasishta@gmail.com> wrote:
Forgot to CC wine-devel..

On Fri, Apr 21, 2017 at 12:47 AM, Aaryaman Vasishta <jem456.vasishta@gmail.com> wrote:
Hi,

On Thu, Apr 20, 2017 at 6:51 AM, Akarsha Sehwag <akarsha15010@iiitd.ac.in> wrote:
Hi
Could someone take out a little time to review the code once?
Bug I intend to solve: https://bugs.winehq.org/show_bug.cgi?id=39640

I am new to wine. So, I would appreciate suggestions regarding my coding style if that's not-so-perfect according to wine standards. Or any other problems with the code I have written. I apologize for submitting an untested code earlier. I hope now it works fine.
No worries! your efforts in contributing is always appreciated :)


/*-------------------------------------------CODE--------------------------------------------------*/
Try using diffs/patches instead of manually copying them in this format. Diffs are easier to apply and test with using git. That's how Stefan was able to detect compilation errors in the patches you sent over on wine-patches. I suggest sending another email with the changes in a diif format if possible.
//DOUBT: Would sizeof(list->pid) be better or sizeof(int)?
//Since in the former case, since list->pid is actually a pointer to DWORD, so //sizeof(list->pid) would return 8 bytes and not 4 bytes.

}
Probably sizeof(DWORD) would be fine as well. In general, try following what the surrounding, previously committed code is doing.
FWIW, pointers don't necessarily have to be 8 bytes in size. The size of a pointer depends on whether your application is compiled as 32 or 64 bit. It's possible to e.g. compile a program as 32 bit on a 64 bit machine.

Cheers,
Aaryaman