1 /* 2 * Gdi handle viewer 3 * 4 * handlelist.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 HandleList_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"Number"; 34 column.cx = 50; 35 (void)ListView_InsertColumn(hListCtrl, 0, &column); 36 37 column.pszText = L"Index"; 38 column.cx = 45; 39 (void)ListView_InsertColumn(hListCtrl, 1, &column); 40 41 column.pszText = L"Handle"; 42 column.cx = 90; 43 (void)ListView_InsertColumn(hListCtrl, 2, &column); 44 45 column.pszText = L"Type"; 46 column.cx = 80; 47 (void)ListView_InsertColumn(hListCtrl, 3, &column); 48 49 column.pszText = L"Process"; 50 column.cx = 80; 51 (void)ListView_InsertColumn(hListCtrl, 4, &column); 52 53 column.pszText = L"KernelData"; 54 column.cx = 80; 55 (void)ListView_InsertColumn(hListCtrl, 5, &column); 56 57 column.pszText = L"UserData"; 58 column.cx = 80; 59 (void)ListView_InsertColumn(hListCtrl, 6, &column); 60 61 column.pszText = L"Type"; 62 column.cx = 80; 63 (void)ListView_InsertColumn(hListCtrl, 7, &column); 64 65 HandleList_Update(hListCtrl, 0); 66 } 67 68 VOID 69 HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessId) 70 { 71 INT i, index; 72 HANDLE handle; 73 PGDI_TABLE_ENTRY pEntry; 74 LVITEM item; 75 TCHAR strText[80]; 76 TCHAR* str2; 77 78 (void)ListView_DeleteAllItems(hHandleListCtrl); 79 item.mask = LVIF_TEXT|LVIF_PARAM; 80 item.pszText = strText; 81 item.cchTextMax = 80; 82 for (i = 0; i<= GDI_HANDLE_COUNT; i++) 83 { 84 pEntry = &GdiHandleTable[i]; 85 if ( ((ProcessId != (HANDLE)1) && ((pEntry->Type & GDI_HANDLE_BASETYPE_MASK) != 0)) || 86 ((ProcessId == (HANDLE)1) && ((pEntry->Type & GDI_HANDLE_BASETYPE_MASK) == 0)) || 87 (ProcessId == (HANDLE)2) ) 88 { 89 if (ProcessId == (HANDLE)1 || ProcessId == (HANDLE)2 || 90 ((LONG_PTR)ProcessId & 0xfffc) == ((LONG_PTR)pEntry->ProcessId & 0xfffc)) 91 { 92 handle = GDI_HANDLE_CREATE(i, pEntry->Type); 93 index = ListView_GetItemCount(hHandleListCtrl); 94 item.iItem = index; 95 item.iSubItem = 0; 96 item.lParam = (LPARAM)handle; 97 98 wsprintf(strText, L"%d", index); 99 (void)ListView_InsertItem(hHandleListCtrl, &item); 100 101 wsprintf(strText, L"%d", i); 102 ListView_SetItemText(hHandleListCtrl, index, 1, strText); 103 104 wsprintf(strText, L"%#08Ix", handle); 105 ListView_SetItemText(hHandleListCtrl, index, 2, strText); 106 107 str2 = GetTypeName(handle); 108 ListView_SetItemText(hHandleListCtrl, index, 3, str2); 109 110 wsprintf(strText, L"%#08Ix", (UINT_PTR)pEntry->ProcessId); 111 ListView_SetItemText(hHandleListCtrl, index, 4, strText); 112 113 wsprintf(strText, L"%#08Ix", (UINT_PTR)pEntry->KernelData); 114 ListView_SetItemText(hHandleListCtrl, index, 5, strText); 115 116 wsprintf(strText, L"%#08Ix", (UINT_PTR)pEntry->UserData); 117 ListView_SetItemText(hHandleListCtrl, index, 6, strText); 118 119 wsprintf(strText, L"%#08x", (UINT)pEntry->Type); 120 ListView_SetItemText(hHandleListCtrl, index, 7, strText); 121 } 122 } 123 } 124 } 125 126 TCHAR* 127 GetTypeName(HANDLE handle) 128 { 129 TCHAR* strText; 130 UINT Type = GDI_HANDLE_GET_TYPE(handle); 131 132 switch (Type) 133 { 134 case GDI_OBJECT_TYPE_DC: 135 strText = L"DC"; 136 break; 137 case GDI_OBJECT_TYPE_REGION: 138 strText = L"Region"; 139 break; 140 case GDI_OBJECT_TYPE_BITMAP: 141 strText = L"Bitmap"; 142 break; 143 case GDI_OBJECT_TYPE_PALETTE: 144 strText = L"Palette"; 145 break; 146 case GDI_OBJECT_TYPE_FONT: 147 strText = L"Font"; 148 break; 149 case GDI_OBJECT_TYPE_BRUSH: 150 strText = L"Brush"; 151 break; 152 case GDI_OBJECT_TYPE_EMF: 153 strText = L"EMF"; 154 break; 155 case GDI_OBJECT_TYPE_PEN: 156 strText = L"Pen"; 157 break; 158 case GDI_OBJECT_TYPE_EXTPEN: 159 strText = L"ExtPen"; 160 break; 161 case GDI_OBJECT_TYPE_COLORSPACE: 162 strText = L"ColSpace"; 163 break; 164 case GDI_OBJECT_TYPE_METADC: 165 strText = L"MetaDC"; 166 break; 167 case GDI_OBJECT_TYPE_METAFILE: 168 strText = L"Metafile"; 169 break; 170 case GDI_OBJECT_TYPE_ENHMETAFILE: 171 strText = L"EMF"; 172 break; 173 case GDI_OBJECT_TYPE_ENHMETADC: 174 strText = L"EMDC"; 175 break; 176 case GDI_OBJECT_TYPE_MEMDC: 177 strText = L"MemDC"; 178 break; 179 case GDI_OBJECT_TYPE_DCE: 180 strText = L"DCE"; 181 break; 182 case GDI_OBJECT_TYPE_PFE: 183 strText = L"PFE"; 184 break; 185 case GDI_OBJECT_TYPE_DONTCARE: 186 strText = L"anything"; 187 break; 188 case GDI_OBJECT_TYPE_SILENT: 189 default: 190 strText = L"unknown"; 191 break; 192 } 193 return strText; 194 } 195