Review | endproc.c: Implement ProcessPage_OnEndProcessTree

Akarsha Sehwag akarsha15010 at iiitd.ac.in
Thu Apr 20 13:10:16 CDT 2017


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 at gmail.com> wrote:

> Forgot to CC wine-devel..
>
> On Fri, Apr 21, 2017 at 12:47 AM, Aaryaman Vasishta <
> jem456.vasishta at gmail.com> wrote:
>
>> Hi,
>>
>> On Thu, Apr 20, 2017 at 6:51 AM, Akarsha Sehwag <akarsha15010 at 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20170420/90312378/attachment-0001.html>


More information about the wine-devel mailing list