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