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. For wine in 64 bit: https://wiki.winehq.org/FAQ#Is_there_a_64_bit_Wine.3F
Cheers, Aaryaman