gdihv: add a possibility to view all handles
[reactos.git] / rosapps / applications / devutils / gdihv / proclist.c
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 }