Review | endproc.c: Implement ProcessPage_OnEndProcessTree

Akarsha Sehwag akarsha15010 at iiitd.ac.in
Wed Apr 19 16:51:44 CDT 2017


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.


/*-------------------------------------------CODE--------------------------------------------------*/
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 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));
*//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.

}

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)
{
   {...}
    process_list      list;
    SIZE_T             i;
    HANDLE           snapshot;

    {...}

    init_process_list(&list);

    if(list.pid == NULL)
        return;

    process_list_append(&list, dwProcessId);

    snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    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);
    }

    free_process_list(&list);
}


/*---------------------------------------END OF
CODE------------------------------------------*/

Thanks and regards
--
Akarsha Sehwag
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-devel/attachments/20170420/ef9a55e6/attachment-0001.html>


More information about the wine-devel mailing list