Hi, just a variable type change and minor style suggestions, some you can accept or ignore.
...
+static BOOL process_list_append(process_list *list, DWORD id) +{
- INT *temp;
- if (list->count == list->size) {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
return;
list->size *= 2;
temp = HeapReAlloc(GetProcessHeap(), 0, list->pid, list->size * sizeof(*list->pid));
if(!temp)
return FALSE;
}list->pid = temp;
- list->pid[list->count++] = id;
- return TRUE;
+}
Please use an empty line to separate variable declaration from code. Change "INT *temp" to "DWORD *temp" so it matches the same type from list->pid. You can also reduce the scope of the temp variable. There are 4 uses of "if(", please change to "if (".
- if (!TerminateProcess(hProcess, 0))
+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)
{
if(!process_list_append(list, entry.th32ProcessID))
{
free_process_list(list);
return;
}
}
- } while (Process32Next(snapshot, &entry));
- end = list->count;
- for (i = start; i < end; ++i) {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
}enum_process_children(snapshot, list, list->pid[i]);
You can drop the { } since there is a single line now, but it is just a suggestion. Other style suggestion is to merge the end attribution inside the for like "for (i = start, end = list-> count; ...".
- CloseHandle(hProcess);
}
void ProcessPage_OnEndProcessTree(void) @@ -100,11 +171,14 @@ void ProcessPage_OnEndProcessTree(void) DWORD dwProcessId; HANDLE hProcess; WCHAR wstrErrorText[256];
process_list list;
SIZE_T i;
HANDLE snapshot;
load_message_strings();
Count = SendMessageW(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
- for (Index=0; Index<Count; Index++)
- for (Index = 0; Index < Count; Index++) { lvitem.mask = LVIF_STATE; lvitem.stateMask = LVIS_SELECTED;
@@ -116,7 +190,6 @@ void ProcessPage_OnEndProcessTree(void) if (lvitem.state & LVIS_SELECTED) break; }
- Count = SendMessageW(hProcessPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0);
Please don't remove the empty line to separate the code from the "for" block.
...
On Sat, Apr 29, 2017 at 7:08 PM, Akarsha Sehwag akarsha15010@iiitd.ac.in wrote:
Fixes https://bugs.winehq.org/show_bug.cgi?id=39640
Implemented ProcessPage_OnEndProcessTree(). It now kills all the child processes along with the specified process.
Signed-off-by: Akarsha Sehwag akarsha15010@iiitd.ac.in
programs/taskmgr/endproc.c | 125 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 105 insertions(+), 20 deletions(-)
diff --git a/programs/taskmgr/endproc.c b/programs/taskmgr/endproc.c index 89c2d7b..60df0d7 100644 --- a/programs/taskmgr/endproc.c +++ b/programs/taskmgr/endproc.c @@ -31,11 +31,18 @@ #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;
- SIZE_T count; /* index to maintain the last entry of the array */
- SIZE_T size;
+} process_list;
static void load_message_strings(void) { LoadStringW(hInst, IDS_TERMINATE_MESSAGE, wszWarnMsg, sizeof(wszWarnMsg)/sizeof(WCHAR)); @@ -43,6 +50,22 @@ static void load_message_strings(void) LoadStringW(hInst, IDS_WARNING_TITLE, wszWarnTitle, sizeof(wszWarnTitle)/sizeof(WCHAR)); }
+static void kill_process(HANDLE hProcess, WCHAR *wstrErrorText) +{
- if (!hProcess)
- {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText, wszUnable2Terminate, MB_OK|MB_ICONSTOP);
return;
- }
- if (!TerminateProcess(hProcess, 0))
- {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText, wszUnable2Terminate, MB_OK|MB_ICONSTOP);
- }
+}
void ProcessPage_OnEndProcess(void) { LVITEMW lvitem; @@ -54,7 +77,7 @@ void ProcessPage_OnEndProcess(void) load_message_strings();
Count = SendMessageW(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
- for (Index=0; Index<Count; Index++)
- for (Index=0; Index < Count; Index++) { lvitem.mask = LVIF_STATE; lvitem.stateMask = LVIS_SELECTED;
@@ -77,20 +100,68 @@ void ProcessPage_OnEndProcess(void)
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
- if (!hProcess)
- kill_process(hProcess, wstrErrorText);
- CloseHandle(hProcess);
+}
+static BOOL init_process_list(process_list *list) +{
- list->size = 4; /* initialise size with 4. Will increase if necessary */
- list->pid = HeapAlloc(GetProcessHeap(), 0, list->size * sizeof(*list->pid));
- list->count = 0;
- return list->pid != NULL;
+}
+static BOOL process_list_append(process_list *list, DWORD id) +{
- INT *temp;
- if (list->count == list->size) {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
return;
list->size *= 2;
temp = HeapReAlloc(GetProcessHeap(), 0, list->pid, list->size * sizeof(*list->pid));
if(!temp)
return FALSE;
}list->pid = temp;
- list->pid[list->count++] = id;
- return TRUE;
+}
- if (!TerminateProcess(hProcess, 0))
+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)
{
if(!process_list_append(list, entry.th32ProcessID))
{
free_process_list(list);
return;
}
}
- } while (Process32Next(snapshot, &entry));
- end = list->count;
- for (i = start; i < end; ++i) {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
}enum_process_children(snapshot, list, list->pid[i]);
- CloseHandle(hProcess);
}
void ProcessPage_OnEndProcessTree(void) @@ -100,11 +171,14 @@ void ProcessPage_OnEndProcessTree(void) DWORD dwProcessId; HANDLE hProcess; WCHAR wstrErrorText[256];
process_list list;
SIZE_T i;
HANDLE snapshot;
load_message_strings();
Count = SendMessageW(hProcessPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
- for (Index=0; Index<Count; Index++)
- for (Index = 0; Index < Count; Index++) { lvitem.mask = LVIF_STATE; lvitem.stateMask = LVIS_SELECTED;
@@ -116,7 +190,6 @@ void ProcessPage_OnEndProcessTree(void) if (lvitem.state & LVIS_SELECTED) break; }
- Count = SendMessageW(hProcessPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0); dwProcessId = PerfDataGetProcessId(Index); if ((Count != 1) || (dwProcessId == 0))
@@ -125,20 +198,32 @@ void ProcessPage_OnEndProcessTree(void) if (MessageBoxW(hMainWnd, wszWarnMsg, wszWarnTitle, MB_YESNO|MB_ICONWARNING) != IDYES) return;
- hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessId);
- if (!init_process_list(&list))
return;
- if (!hProcess)
- if (!process_list_append(&list, dwProcessId)) {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
}free_process_list(&list); return;
- if (!TerminateProcess(hProcess, 0))
- snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (snapshot == INVALID_HANDLE_VALUE) {
GetLastErrorText(wstrErrorText, sizeof(wstrErrorText)/sizeof(WCHAR));
MessageBoxW(hMainWnd, wstrErrorText,wszUnable2Terminate, MB_OK|MB_ICONSTOP);
free_process_list(&list);
}return;
- enum_process_children(snapshot, &list, dwProcessId);
- CloseHandle(snapshot);
- CloseHandle(hProcess);
- for (i = 0; i < list.count; ++i)
- {
hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, list.pid[i]);
kill_process(hProcess, wstrErrorText);
CloseHandle(hProcess);
- }
- free_process_list(&list);
}
2.9.3