- add base type mask
- change my email
- add deleted entries
- full row selection

svn path=/trunk/; revision=29261
This commit is contained in:
Timo Kreuzer 2007-09-27 22:29:26 +00:00
parent 945a85f7cb
commit 5b816f2612
7 changed files with 86 additions and 55 deletions

View file

@ -9,12 +9,13 @@ typedef struct _GDI_TABLE_ENTRY
typedef PGDI_TABLE_ENTRY (CALLBACK * GDIQUERYPROC) (void);
/* GDI handle table can hold 0x4000 handles */
#define GDI_HANDLE_COUNT 0x4000
#define GDI_HANDLE_COUNT 0x10000
#define GDI_GLOBAL_PROCESS (0x0)
/* Handle Masks and shifts */
#define GDI_HANDLE_INDEX_MASK (GDI_HANDLE_COUNT - 1)
#define GDI_HANDLE_TYPE_MASK 0x007f0000
#define GDI_HANDLE_BASETYPE_MASK 0x001f0000
#define GDI_HANDLE_STOCK_MASK 0x00800000
#define GDI_HANDLE_REUSE_MASK 0xff000000
#define GDI_HANDLE_REUSECNT_SHIFT 24

View file

@ -3,7 +3,7 @@
*
* gdihv.c
*
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> web.de>
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> reactos <dot> org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -14,5 +14,3 @@ BEGIN
PUSHBUTTON "Refresh processes", IDC_REFRESHPROCESS, 50, 230, 80, 14, WS_CLIPSIBLINGS | WS_TABSTOP
END

View file

@ -3,7 +3,7 @@
*
* handlelist.c
*
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> web.de>
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> reactos <dot> org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -71,7 +71,7 @@ HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessId)
INT i, index;
HANDLE handle;
PGDI_TABLE_ENTRY pEntry;
LV_ITEM item;
LVITEM item;
TCHAR strText[80];
TCHAR* str2;
@ -82,13 +82,17 @@ HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessId)
for (i = 0; i<= GDI_HANDLE_COUNT; i++)
{
pEntry = &GdiHandleTable[i];
if (pEntry->KernelData)
if ( ((ProcessId != (HANDLE)1) && ((pEntry->Type & GDI_HANDLE_BASETYPE_MASK) != 0)) ||
((ProcessId == (HANDLE)1) && ((pEntry->Type & GDI_HANDLE_BASETYPE_MASK) == 0)) )
{
if (ProcessId == (HANDLE)-1 || ProcessId == pEntry->ProcessId)
if (ProcessId == (HANDLE)1 ||
ProcessId == (HANDLE)((ULONG)pEntry->ProcessId & 0xfffc))
{
handle = GDI_HANDLE_CREATE(i, pEntry->Type);
index = ListView_GetItemCount(hHandleListCtrl);
item.iItem = index;
item.iSubItem = 0;
item.lParam = (LPARAM)handle;
wsprintf(strText, L"%d", index);
(void)ListView_InsertItem(hHandleListCtrl, &item);
@ -96,7 +100,6 @@ HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessId)
wsprintf(strText, L"%d", i);
ListView_SetItemText(hHandleListCtrl, index, 1, strText);
handle = GDI_HANDLE_CREATE(i, pEntry->Type);
wsprintf(strText, L"%#08x", handle);
ListView_SetItemText(hHandleListCtrl, index, 2, strText);

View file

@ -3,7 +3,7 @@
*
* mainwnd.c
*
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> web.de>
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> reactos <dot> org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -24,6 +24,59 @@
INT g_Separator;
static LRESULT
MainWindow_OnSize(HWND hMainWnd)
{
HWND hProcessListctrl, hHandleListCtrl, hProcessRefresh, hHandleRefresh;
RECT rect;
hProcessListctrl = GetDlgItem(hMainWnd, IDC_PROCESSLIST);
hHandleListCtrl = GetDlgItem(hMainWnd, IDC_HANDLELIST);
hProcessRefresh = GetDlgItem(hMainWnd, IDC_REFRESHPROCESS);
hHandleRefresh = GetDlgItem(hMainWnd, IDC_REFRESHHANDLE);
GetClientRect(hMainWnd, &rect);
//g_Separator = (rect.right / 2);
MoveWindow(hProcessListctrl, 5, 5, g_Separator - 5, rect.bottom - 40, TRUE);
MoveWindow(hHandleListCtrl, g_Separator + 5, 5, rect.right - g_Separator - 5, rect.bottom - 40, TRUE);
MoveWindow(hProcessRefresh, g_Separator - 90, rect.bottom - 30, 90, 25, TRUE);
MoveWindow(hHandleRefresh, rect.right - 90, rect.bottom - 30, 90, 25, TRUE);
return 0;
}
static LRESULT
MainWnd_OnNotify(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
LPNMHDR pnmh = (LPNMHDR)lParam;
switch(pnmh->code)
{
case LVN_ITEMCHANGED:
{
LPNMLISTVIEW pnmlv = (LPNMLISTVIEW)pnmh;
if ((wParam == IDC_PROCESSLIST)
&& (pnmlv->uNewState & LVIS_SELECTED)
&& !(pnmlv->uOldState & LVIS_SELECTED))
{
LV_ITEM item;
memset(&item, 0, sizeof(LV_ITEM));
item.mask = LVIF_PARAM;
item.iItem = pnmlv->iItem;
(void)ListView_GetItem(GetDlgItem(hWnd, IDC_PROCESSLIST), &item);
HandleList_Update(GetDlgItem(hWnd, IDC_HANDLELIST), (HANDLE)item.lParam);
return TRUE;
}
break;
}
}
return 0;
}
INT_PTR CALLBACK
MainWindow_WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
@ -34,6 +87,8 @@ MainWindow_WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
RECT rect;
SendMessage(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAIN)));
(void)ListView_SetExtendedListViewStyle(GetDlgItem(hMainWnd, IDC_PROCESSLIST), LVS_EX_FULLROWSELECT);
(void)ListView_SetExtendedListViewStyle(GetDlgItem(hMainWnd, IDC_HANDLELIST), LVS_EX_FULLROWSELECT);
GetClientRect(hMainWnd, &rect);
g_Separator = (rect.right / 2);
HandleList_Create(GetDlgItem(hMainWnd, IDC_HANDLELIST));
@ -43,10 +98,8 @@ MainWindow_WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
}
case WM_SIZE:
{
MainWindow_OnSize(hMainWnd);
break;
}
return MainWindow_OnSize(hMainWnd);
case WM_COMMAND:
{
switch (LOWORD(wParam))
@ -80,23 +133,10 @@ MainWindow_WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
}
break;
}
case WM_NOTIFY:
{
if (((LPNMLISTVIEW)lParam)->hdr.code == LVN_ITEMCHANGED
&& (wParam == IDC_PROCESSLIST)
&& (((LPNMLISTVIEW)lParam)->uNewState & LVIS_SELECTED)
&& !(((LPNMLISTVIEW)lParam)->uOldState & LVIS_SELECTED))
{
LV_ITEM item;
memset(&item, 0, sizeof(LV_ITEM));
item.mask = LVIF_PARAM;
item.iItem = ((LPNMLISTVIEW)lParam)->iItem;
(void)ListView_GetItem(GetDlgItem(hMainWnd, IDC_PROCESSLIST), &item);
HandleList_Update(GetDlgItem(hMainWnd, IDC_HANDLELIST), (HANDLE)item.lParam);
return TRUE;
break;
}
}
return MainWnd_OnNotify(hMainWnd, wParam, lParam);
default:
{
return FALSE;
@ -105,23 +145,3 @@ MainWindow_WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
return TRUE;
}
VOID
MainWindow_OnSize(HWND hMainWnd)
{
HWND hProcessListctrl, hHandleListCtrl, hProcessRefresh, hHandleRefresh;
RECT rect;
hProcessListctrl = GetDlgItem(hMainWnd, IDC_PROCESSLIST);
hHandleListCtrl = GetDlgItem(hMainWnd, IDC_HANDLELIST);
hProcessRefresh = GetDlgItem(hMainWnd, IDC_REFRESHPROCESS);
hHandleRefresh = GetDlgItem(hMainWnd, IDC_REFRESHHANDLE);
GetClientRect(hMainWnd, &rect);
//g_Separator = (rect.right / 2);
MoveWindow(hProcessListctrl, 5, 5, g_Separator - 5, rect.bottom - 40, TRUE);
MoveWindow(hHandleListCtrl, g_Separator + 5, 5, rect.right - g_Separator - 5, rect.bottom - 40, TRUE);
MoveWindow(hProcessRefresh, g_Separator - 90, rect.bottom - 30, 90, 25, TRUE);
MoveWindow(hHandleRefresh, rect.right - 90, rect.bottom - 30, 90, 25, TRUE);
return;
}

View file

@ -1,3 +1,2 @@
INT_PTR CALLBACK MainWindow_WndProc(HWND, UINT, WPARAM, LPARAM);
VOID MainWindow_OnSize(HWND hMainWnd);

View file

@ -3,7 +3,7 @@
*
* proclist.c
*
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> web.de>
* Copyright (C) 2007 Timo Kreuzer <timo <dot> kreuzer <at> reactos <dot> org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -44,7 +44,8 @@ VOID
ProcessList_Update(HWND hListCtrl)
{
LV_ITEM item;
DWORD ProcessIds[1024], BytesReturned, cProcesses;
DWORD ProcessIds[1024], BytesReturned;
UINT cProcesses;
HANDLE hProcess;
WCHAR strText[MAX_PATH] = L"<unknown>";
INT i;
@ -63,12 +64,21 @@ ProcessList_Update(HWND hListCtrl)
wsprintf(strText, L"%#08x", 0);
ListView_SetItemText(hListCtrl, 0, 1, strText);
/* Insert "deleted" */
item.iItem = 1;
item.lParam = 1;
item.pszText = L"<deleted>";
(void)ListView_InsertItem(hListCtrl, &item);
item.pszText = strText;
wsprintf(strText, L"%#08x",1);
ListView_SetItemText(hListCtrl, 1, 1, strText);
if (!EnumProcesses(ProcessIds, sizeof(ProcessIds), &BytesReturned ))
{
return;
}
cProcesses = BytesReturned / sizeof(DWORD);
if (cProcesses == 0)
if (cProcesses <= 1)
{
return;
}
@ -80,7 +90,7 @@ ProcessList_Update(HWND hListCtrl)
hProcess = 0;
/* FIXME: HACK: ROS crashes when using OpenProcess with PROCESS_VM_READ */
// hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessIds[i]);
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessIds[i]);
if (hProcess)
{
GetModuleBaseName(hProcess, NULL, (LPWSTR)strText, MAX_PATH );