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