1 /*
2  *	Gdi handle viewer
3  *
4  *	proclist.c
5  *
6  *	Copyright (C) 2007	Timo Kreuzer <timo <dot> kreuzer <at> reactos <dot> org>
7  *
8  *	This program is free software; you can redistribute it and/or modify
9  *	it under the terms of the GNU General Public License as published by
10  *	the Free Software Foundation; either version 2 of the License, or
11  *	(at your option) any later version.
12  *
13  *	This program is distributed in the hope that it will be useful,
14  *	but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *	GNU General Public License for more details.
17  *
18  *	You should have received a copy of the GNU General Public License
19  *	along with this program; if not, write to the Free Software
20  *	Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21  */
22 
23 #include "gdihv.h"
24 
25 VOID
26 ProcessList_Create(HWND hListCtrl)
27 {
28 	LVCOLUMN column;
29 
30 	column.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
31 	column.fmt = LVCFMT_LEFT;
32 
33 	column.pszText = L"Process";
34 	column.cx = 90;
35 	(void)ListView_InsertColumn(hListCtrl, 0, &column);
36 
37 	column.pszText = L"ProcessID";
38 	column.cx = 90;
39 	(void)ListView_InsertColumn(hListCtrl, 1, &column);
40 	ProcessList_Update(hListCtrl);
41 }
42 
43 VOID
44 ProcessList_Update(HWND hListCtrl)
45 {
46 	LV_ITEM item;
47 	DWORD ProcessIds[1024], BytesReturned;
48 	UINT cProcesses;
49 	HANDLE hProcess;
50 	WCHAR strText[MAX_PATH] = L"<unknown>";
51 	INT i;
52 
53 	(void)ListView_DeleteAllItems(hListCtrl);
54 	memset(&item, 0, sizeof(LV_ITEM));
55 	item.mask = LVIF_TEXT|LVIF_PARAM;
56 	item.pszText = strText;
57 
58 	/* Insert "kernel" */
59 	item.iItem = 0;
60 	item.lParam = 0;
61 	item.pszText = L"<Kernel>";
62 	(void)ListView_InsertItem(hListCtrl, &item);
63 	item.pszText = strText;
64 	wsprintf(strText, L"%#08x", 0);
65 	ListView_SetItemText(hListCtrl, 0, 1, strText);
66 
67 	/* Insert "deleted" */
68 	item.iItem = 1;
69 	item.lParam = 1;
70 	item.pszText = L"<deleted>";
71 	(void)ListView_InsertItem(hListCtrl, &item);
72 	item.pszText = strText;
73 	wsprintf(strText, L"%#08x", 1);
74 	ListView_SetItemText(hListCtrl, 1, 1, strText);
75 
76 	/* Insert "all" */
77 	item.iItem = 2;
78 	item.lParam = 2;
79 	item.pszText = L"<all>";
80 	(void)ListView_InsertItem(hListCtrl, &item);
81 	item.pszText = strText;
82 	wsprintf(strText, L"%#08x", 2);
83 	ListView_SetItemText(hListCtrl, 1, 1, strText);
84 
85 	if (!EnumProcesses(ProcessIds, sizeof(ProcessIds), &BytesReturned ))
86 	{
87 		return;
88 	}
89 	cProcesses = BytesReturned / sizeof(DWORD);
90 	if (cProcesses <= 1)
91 	{
92 		return;
93 	}
94 	for (i = 1; i < cProcesses; i++)
95 	{
96 		wsprintf(strText, L"<unknown>");
97 		item.lParam = ProcessIds[i];
98 		item.iItem = ListView_GetItemCount(hListCtrl);
99 
100 		hProcess = 0;
101 		/* FIXME: HACK: ROS crashes when using OpenProcess with PROCESS_VM_READ */
102 		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessIds[i]);
103 		if (hProcess)
104 		{
105 			GetModuleBaseName(hProcess, NULL, (LPWSTR)strText, MAX_PATH );
106 			CloseHandle(hProcess);
107 		}
108 		(void)ListView_InsertItem(hListCtrl, &item);
109 
110 		wsprintf(strText, L"%#08x", ProcessIds[i]);
111 		ListView_SetItemText(hListCtrl, item.iItem, 1, strText);
112 	}
113 }
114