mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 05:00:27 +00:00
A gdi handle viewer.
There's currently a hack, to make it work on ROS, OpenProcess() crashes ROS, so currently you will not see the processes names. svn path=/trunk/; revision=25755
This commit is contained in:
parent
f5dd45afa8
commit
8c6bd0b95a
14 changed files with 704 additions and 0 deletions
64
rosapps/devutils/gdihv/gdi.h
Normal file
64
rosapps/devutils/gdihv/gdi.h
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
typedef struct _GDI_TABLE_ENTRY
|
||||||
|
{
|
||||||
|
PVOID KernelData; /* Points to the kernel mode structure */
|
||||||
|
HANDLE ProcessId; /* process id that created the object, 0 for stock objects */
|
||||||
|
LONG Type; /* the first 16 bit is the object type including the stock obj flag, the last 16 bits is just the object type */
|
||||||
|
PVOID UserData; /* Points to the user mode structure, usually NULL though */
|
||||||
|
} GDI_TABLE_ENTRY, *PGDI_TABLE_ENTRY;
|
||||||
|
|
||||||
|
typedef PGDI_TABLE_ENTRY (CALLBACK * GDIQUERYPROC) (void);
|
||||||
|
|
||||||
|
/* GDI handle table can hold 0x4000 handles */
|
||||||
|
#define GDI_HANDLE_COUNT 0x4000
|
||||||
|
#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_STOCK_MASK 0x00800000
|
||||||
|
#define GDI_HANDLE_REUSE_MASK 0xff000000
|
||||||
|
#define GDI_HANDLE_REUSECNT_SHIFT 24
|
||||||
|
#define GDI_HANDLE_UPPER_MASK 0xffff0000
|
||||||
|
|
||||||
|
/* Handle macros */
|
||||||
|
#define GDI_HANDLE_CREATE(i, t) \
|
||||||
|
((HANDLE)(((i) & GDI_HANDLE_INDEX_MASK) | ((t) & GDI_HANDLE_UPPER_MASK)))
|
||||||
|
|
||||||
|
#define GDI_HANDLE_GET_INDEX(h) \
|
||||||
|
(((ULONG_PTR)(h)) & GDI_HANDLE_INDEX_MASK)
|
||||||
|
|
||||||
|
#define GDI_HANDLE_GET_TYPE(h) \
|
||||||
|
(((ULONG_PTR)(h)) & GDI_HANDLE_TYPE_MASK)
|
||||||
|
|
||||||
|
#define GDI_HANDLE_IS_TYPE(h, t) \
|
||||||
|
((t) == (((ULONG_PTR)(h)) & GDI_HANDLE_TYPE_MASK))
|
||||||
|
|
||||||
|
#define GDI_HANDLE_IS_STOCKOBJ(h) \
|
||||||
|
(0 != (((ULONG_PTR)(h)) & GDI_HANDLE_STOCK_MASK))
|
||||||
|
|
||||||
|
#define GDI_HANDLE_SET_STOCKOBJ(h) \
|
||||||
|
((h) = (HANDLE)(((ULONG_PTR)(h)) | GDI_HANDLE_STOCK_MASK))
|
||||||
|
|
||||||
|
#define GDI_HANDLE_GET_UPPER(h) \
|
||||||
|
(((ULONG_PTR)(h)) & GDI_HANDLE_UPPER_MASK)
|
||||||
|
|
||||||
|
#define GDI_OBJECT_TYPE_DC 0x00010000
|
||||||
|
#define GDI_OBJECT_TYPE_REGION 0x00040000
|
||||||
|
#define GDI_OBJECT_TYPE_BITMAP 0x00050000
|
||||||
|
#define GDI_OBJECT_TYPE_PALETTE 0x00080000
|
||||||
|
#define GDI_OBJECT_TYPE_FONT 0x000a0000
|
||||||
|
#define GDI_OBJECT_TYPE_BRUSH 0x00100000
|
||||||
|
#define GDI_OBJECT_TYPE_EMF 0x00210000
|
||||||
|
#define GDI_OBJECT_TYPE_PEN 0x00300000
|
||||||
|
#define GDI_OBJECT_TYPE_EXTPEN 0x00500000
|
||||||
|
#define GDI_OBJECT_TYPE_COLORSPACE 0x00090000
|
||||||
|
#define GDI_OBJECT_TYPE_METADC 0x00660000
|
||||||
|
#define GDI_OBJECT_TYPE_METAFILE 0x00260000
|
||||||
|
#define GDI_OBJECT_TYPE_ENHMETAFILE 0x00460000
|
||||||
|
/* Following object types made up for ROS */
|
||||||
|
#define GDI_OBJECT_TYPE_ENHMETADC 0x00740000
|
||||||
|
#define GDI_OBJECT_TYPE_MEMDC 0x00750000
|
||||||
|
#define GDI_OBJECT_TYPE_DCE 0x00770000
|
||||||
|
#define GDI_OBJECT_TYPE_DONTCARE 0x007f0000
|
||||||
|
/** Not really an object type. Forces GDI_FreeObj to be silent. */
|
||||||
|
#define GDI_OBJECT_TYPE_SILENT 0x80000000
|
50
rosapps/devutils/gdihv/gdihv.c
Normal file
50
rosapps/devutils/gdihv/gdihv.c
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Gdi handle viewer
|
||||||
|
*
|
||||||
|
* gdihv.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Timo kreuzer <timo <dot> kreuzer <at> web.de>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gdihv.h"
|
||||||
|
|
||||||
|
HINSTANCE g_hInstance;
|
||||||
|
GDIQUERYPROC GdiQueryHandleTable;
|
||||||
|
PGDI_TABLE_ENTRY GdiHandleTable = 0;
|
||||||
|
|
||||||
|
int WINAPI WinMain (HINSTANCE hThisInstance,
|
||||||
|
HINSTANCE hPrevInstance,
|
||||||
|
LPSTR lpszArgument,
|
||||||
|
int nStyle)
|
||||||
|
|
||||||
|
{
|
||||||
|
g_hInstance = hThisInstance;
|
||||||
|
|
||||||
|
InitCommonControls();
|
||||||
|
|
||||||
|
GdiQueryHandleTable = (GDIQUERYPROC)GetProcAddress(GetModuleHandle(L"GDI32.DLL"), "GdiQueryTable");
|
||||||
|
if(!GdiQueryHandleTable)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
GdiHandleTable = GdiQueryHandleTable();
|
||||||
|
|
||||||
|
DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_MAINWND), HWND_DESKTOP, MainWindow_WndProc, 0);
|
||||||
|
|
||||||
|
/* The program return value is 0 */
|
||||||
|
return 0;
|
||||||
|
}
|
120
rosapps/devutils/gdihv/gdihv.cbp
Normal file
120
rosapps/devutils/gdihv/gdihv.cbp
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
|
||||||
|
<CodeBlocks_project_file>
|
||||||
|
<FileVersion major="1" minor="5" />
|
||||||
|
<Project>
|
||||||
|
<Option title="gdihv" />
|
||||||
|
<Option pch_mode="2" />
|
||||||
|
<Option default_target="" />
|
||||||
|
<Option compiler="gcc" />
|
||||||
|
<Build>
|
||||||
|
<Target title="Debug">
|
||||||
|
<Option output="..\..\..\..\output-i386\modules\rosapps\devutils\gdihv\gdihv.exe" />
|
||||||
|
<Option working_dir="..\..\..\..\output-i386\modules\rosapps\devutils\gdihv" />
|
||||||
|
<Option object_output="..\..\..\..\obj-i386\modules\rosapps\devutils\gdihv" />
|
||||||
|
<Option type="0" />
|
||||||
|
<Option compiler="gcc" />
|
||||||
|
<Compiler>
|
||||||
|
<Add option="-g" />
|
||||||
|
<Add option="-D__USE_W32API" />
|
||||||
|
<Add option="-D_WIN32_IE=0x0501" />
|
||||||
|
<Add option="-D_WIN32_WINNT=0x0501" />
|
||||||
|
<Add directory="..\..\..\..\include" />
|
||||||
|
<Add directory="..\..\..\..\include\crt" />
|
||||||
|
<Add directory="..\..\..\..\include\psdk" />
|
||||||
|
<Add directory="..\..\..\..\include\ndk" />
|
||||||
|
<Add directory="..\..\..\..\include\ddk" />
|
||||||
|
</Compiler>
|
||||||
|
<Linker>
|
||||||
|
<Add library="user32" />
|
||||||
|
<Add library="kernel32" />
|
||||||
|
<Add library="comctl32" />
|
||||||
|
<Add library="psapi" />
|
||||||
|
</Linker>
|
||||||
|
</Target>
|
||||||
|
</Build>
|
||||||
|
<Compiler>
|
||||||
|
<Add option="-Wall" />
|
||||||
|
</Compiler>
|
||||||
|
<Linker>
|
||||||
|
<Add library="gdi32" />
|
||||||
|
<Add library="user32" />
|
||||||
|
<Add library="kernel32" />
|
||||||
|
</Linker>
|
||||||
|
<Unit filename="gdi.h">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="gdihv.c">
|
||||||
|
<Option compilerVar="CC" />
|
||||||
|
<Option virtualFolder="source\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="gdihv.h">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="gdihv.rbuild">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="gdihv.rc">
|
||||||
|
<Option compilerVar="WINDRES" />
|
||||||
|
<Option virtualFolder="resources\" />
|
||||||
|
<Option objectName="gdihv.res" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="handlelist.c">
|
||||||
|
<Option compilerVar="CC" />
|
||||||
|
<Option virtualFolder="source\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="handlelist.h">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="mainwnd.c">
|
||||||
|
<Option compilerVar="CC" />
|
||||||
|
<Option virtualFolder="source\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="mainwnd.h">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="proclist.c">
|
||||||
|
<Option compilerVar="CC" />
|
||||||
|
<Option virtualFolder="source\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="proclist.h">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Unit filename="resource.h">
|
||||||
|
<Option compilerVar="CPP" />
|
||||||
|
<Option compile="0" />
|
||||||
|
<Option link="0" />
|
||||||
|
<Option virtualFolder="header\" />
|
||||||
|
<Option target="Debug" />
|
||||||
|
</Unit>
|
||||||
|
<Extensions />
|
||||||
|
</Project>
|
||||||
|
</CodeBlocks_project_file>
|
22
rosapps/devutils/gdihv/gdihv.h
Normal file
22
rosapps/devutils/gdihv/gdihv.h
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#ifndef _GDIHV_H
|
||||||
|
#define _GDIHV_H
|
||||||
|
|
||||||
|
#define UNICODE
|
||||||
|
|
||||||
|
#define WIN32_NO_STATUS
|
||||||
|
#include <windows.h>
|
||||||
|
#include <commctrl.h>
|
||||||
|
#include <ndk/ntndk.h>
|
||||||
|
#include <psapi.h>
|
||||||
|
|
||||||
|
#include "gdi.h"
|
||||||
|
#include "mainwnd.h"
|
||||||
|
#include "proclist.h"
|
||||||
|
#include "handlelist.h"
|
||||||
|
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
extern PGDI_TABLE_ENTRY GdiHandleTable;
|
||||||
|
extern HINSTANCE g_hInstance;
|
||||||
|
|
||||||
|
#endif //_GDIHV_H
|
15
rosapps/devutils/gdihv/gdihv.rbuild
Normal file
15
rosapps/devutils/gdihv/gdihv.rbuild
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<module name="gdihv" type="win32gui" installbase="system32" installname="gdihv.exe">
|
||||||
|
<include base="gdihv">.</include>
|
||||||
|
<define name="__USE_W32API" />
|
||||||
|
<define name="_WIN32_IE">0x0501</define>
|
||||||
|
<define name="_WIN32_WINNT">0x0501</define>
|
||||||
|
<library>user32</library>
|
||||||
|
<library>kernel32</library>
|
||||||
|
<library>comctl32</library>
|
||||||
|
<library>psapi</library>
|
||||||
|
<file>gdihv.c</file>
|
||||||
|
<file>gdihv.rc</file>
|
||||||
|
<file>mainwnd.c</file>
|
||||||
|
<file>handlelist.c</file>
|
||||||
|
<file>proclist.c</file>
|
||||||
|
</module>
|
18
rosapps/devutils/gdihv/gdihv.rc
Normal file
18
rosapps/devutils/gdihv/gdihv.rc
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#include <windows.h>
|
||||||
|
#include "resource.h"
|
||||||
|
|
||||||
|
IDI_MAIN ICON "system.ico"
|
||||||
|
|
||||||
|
IDD_MAINWND DIALOGEX 0, 0, 260, 250
|
||||||
|
STYLE WS_CAPTION | WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_THICKFRAME | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX
|
||||||
|
CAPTION "HandleView"
|
||||||
|
FONT 8, "MS Shell Dlg"
|
||||||
|
BEGIN
|
||||||
|
CONTROL "Tasks", IDC_PROCESSLIST, "SysListView32", WS_BORDER | WS_TABSTOP | 0x00000001 | LVS_REPORT, 5, 5, 100, 200
|
||||||
|
CONTROL "Tasks", IDC_HANDLELIST, "SysListView32", WS_BORDER | WS_TABSTOP | 0x00000001 | LVS_REPORT, 110, 5, 150, 200
|
||||||
|
PUSHBUTTON "Refresh handles", IDC_REFRESHHANDLE, 200, 230, 80, 14, WS_CLIPSIBLINGS | WS_TABSTOP
|
||||||
|
PUSHBUTTON "Refresh processes", IDC_REFRESHPROCESS, 50, 230, 80, 14, WS_CLIPSIBLINGS | WS_TABSTOP
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
|
177
rosapps/devutils/gdihv/handlelist.c
Normal file
177
rosapps/devutils/gdihv/handlelist.c
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
/*
|
||||||
|
* Gdi handle viewer
|
||||||
|
*
|
||||||
|
* handlelist.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Timo kreuzer <timo <dot> kreuzer <at> web.de>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gdihv.h"
|
||||||
|
|
||||||
|
VOID
|
||||||
|
HandleList_Create(HWND hListCtrl)
|
||||||
|
{
|
||||||
|
LVCOLUMN column;
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
|
||||||
|
column.fmt = LVCFMT_LEFT;
|
||||||
|
|
||||||
|
column.pszText = L"Number";
|
||||||
|
column.cx = 50;
|
||||||
|
ListView_InsertColumn(hListCtrl, 0, &column);
|
||||||
|
|
||||||
|
column.pszText = L"Index";
|
||||||
|
column.cx = 50;
|
||||||
|
ListView_InsertColumn(hListCtrl, 1, &column);
|
||||||
|
|
||||||
|
column.pszText = L"Handle";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 2, &column);
|
||||||
|
|
||||||
|
column.pszText = L"Type";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 3, &column);
|
||||||
|
|
||||||
|
column.pszText = L"Process";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 4, &column);
|
||||||
|
|
||||||
|
column.pszText = L"KernelData";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 5, &column);
|
||||||
|
|
||||||
|
column.pszText = L"UserData";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 6, &column);
|
||||||
|
|
||||||
|
HandleList_Update(hListCtrl, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessId)
|
||||||
|
{
|
||||||
|
INT i, index;
|
||||||
|
PGDI_TABLE_ENTRY pEntry;
|
||||||
|
LV_ITEM item;
|
||||||
|
TCHAR strText[80];
|
||||||
|
TCHAR* str2;
|
||||||
|
|
||||||
|
ListView_DeleteAllItems(hHandleListCtrl);
|
||||||
|
item.mask = LVIF_TEXT|LVIF_PARAM;
|
||||||
|
item.pszText = strText;
|
||||||
|
item.cchTextMax = 80;
|
||||||
|
for (i = 0; i<= GDI_HANDLE_COUNT; i++)
|
||||||
|
{
|
||||||
|
pEntry = &GdiHandleTable[i];
|
||||||
|
if (pEntry->KernelData)
|
||||||
|
{
|
||||||
|
if (ProcessId == (HANDLE)-1 || ProcessId == pEntry->ProcessId)
|
||||||
|
{
|
||||||
|
index = ListView_GetItemCount(hHandleListCtrl);
|
||||||
|
item.iItem = index;
|
||||||
|
item.iSubItem = 0;
|
||||||
|
|
||||||
|
wsprintf(strText, L"%d", index);
|
||||||
|
ListView_InsertItem(hHandleListCtrl, &item);
|
||||||
|
|
||||||
|
wsprintf(strText, L"%d", i);
|
||||||
|
ListView_SetItemText(hHandleListCtrl, index, 1, strText);
|
||||||
|
|
||||||
|
wsprintf(strText, L"%#08x", GDI_HANDLE_CREATE(i, pEntry->Type));
|
||||||
|
ListView_SetItemText(hHandleListCtrl, index, 2, strText);
|
||||||
|
|
||||||
|
str2 = GetTypeName(pEntry->Type & GDI_HANDLE_TYPE_MASK);
|
||||||
|
ListView_SetItemText(hHandleListCtrl, index, 3, str2);
|
||||||
|
|
||||||
|
wsprintf(strText, L"%#08x", (UINT)pEntry->ProcessId);
|
||||||
|
ListView_SetItemText(hHandleListCtrl, index, 4, strText);
|
||||||
|
|
||||||
|
wsprintf(strText, L"%#08x", (UINT)pEntry->KernelData);
|
||||||
|
ListView_SetItemText(hHandleListCtrl, index, 5, strText);
|
||||||
|
|
||||||
|
wsprintf(strText, L"%#08x", (UINT)pEntry->UserData);
|
||||||
|
ListView_SetItemText(hHandleListCtrl, index, 6, strText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TCHAR*
|
||||||
|
GetTypeName(UINT Type)
|
||||||
|
{
|
||||||
|
TCHAR* strText;
|
||||||
|
|
||||||
|
switch (Type)
|
||||||
|
{
|
||||||
|
case GDI_OBJECT_TYPE_DC:
|
||||||
|
strText = L"DC";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_REGION:
|
||||||
|
strText = L"Region";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_BITMAP:
|
||||||
|
strText = L"Bitmap";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_PALETTE:
|
||||||
|
strText = L"Palette";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_FONT:
|
||||||
|
strText = L"Font";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_BRUSH:
|
||||||
|
strText = L"Brush";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_EMF:
|
||||||
|
strText = L"EMF";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_PEN:
|
||||||
|
strText = L"Pen";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_EXTPEN:
|
||||||
|
strText = L"ExtPen";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_COLORSPACE:
|
||||||
|
strText = L"ColSpace";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_METADC:
|
||||||
|
strText = L"MetaDC";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_METAFILE:
|
||||||
|
strText = L"Metafile";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_ENHMETAFILE:
|
||||||
|
strText = L"EMF";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_ENHMETADC:
|
||||||
|
strText = L"EMDC";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_MEMDC:
|
||||||
|
strText = L"MemDC";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_DCE:
|
||||||
|
strText = L"DCE";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_DONTCARE:
|
||||||
|
strText = L"anything";
|
||||||
|
break;
|
||||||
|
case GDI_OBJECT_TYPE_SILENT:
|
||||||
|
default:
|
||||||
|
strText = L"unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return strText;
|
||||||
|
}
|
4
rosapps/devutils/gdihv/handlelist.h
Normal file
4
rosapps/devutils/gdihv/handlelist.h
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
VOID HandleList_Create(HWND hListCtrl);
|
||||||
|
VOID HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessID);
|
||||||
|
TCHAR* GetTypeName(UINT Type);
|
126
rosapps/devutils/gdihv/mainwnd.c
Normal file
126
rosapps/devutils/gdihv/mainwnd.c
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
/*
|
||||||
|
* Gdi handle viewer
|
||||||
|
*
|
||||||
|
* mainwnd.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Timo kreuzer <timo <dot> kreuzer <at> web.de>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gdihv.h"
|
||||||
|
|
||||||
|
INT g_Separator;
|
||||||
|
|
||||||
|
INT_PTR CALLBACK
|
||||||
|
MainWindow_WndProc(HWND hMainWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
||||||
|
{
|
||||||
|
switch (message)
|
||||||
|
{
|
||||||
|
case WM_INITDIALOG:
|
||||||
|
{
|
||||||
|
RECT rect;
|
||||||
|
|
||||||
|
SendMessage(hMainWnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_MAIN)));
|
||||||
|
GetClientRect(hMainWnd, &rect);
|
||||||
|
g_Separator = (rect.right / 2);
|
||||||
|
HandleList_Create(GetDlgItem(hMainWnd, IDC_HANDLELIST));
|
||||||
|
ProcessList_Create(GetDlgItem(hMainWnd, IDC_PROCESSLIST));
|
||||||
|
MainWindow_OnSize(hMainWnd);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_SIZE:
|
||||||
|
{
|
||||||
|
MainWindow_OnSize(hMainWnd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_COMMAND:
|
||||||
|
{
|
||||||
|
switch (LOWORD(wParam))
|
||||||
|
{
|
||||||
|
case IDOK:
|
||||||
|
case IDCANCEL:
|
||||||
|
{
|
||||||
|
EndDialog(hMainWnd, IDOK);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IDC_REFRESHHANDLE:
|
||||||
|
{
|
||||||
|
LV_ITEM item;
|
||||||
|
HWND hProcessListCtrl = GetDlgItem(hMainWnd, IDC_PROCESSLIST);
|
||||||
|
memset(&item, 0, sizeof(LV_ITEM));
|
||||||
|
item.mask = LVIF_PARAM;
|
||||||
|
item.iItem = ListView_GetSelectionMark(hProcessListCtrl);
|
||||||
|
ListView_GetItem(hProcessListCtrl, &item);
|
||||||
|
HandleList_Update(GetDlgItem(hMainWnd, IDC_HANDLELIST), (HANDLE)item.lParam);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IDC_REFRESHPROCESS:
|
||||||
|
{
|
||||||
|
ProcessList_Update(GetDlgItem(hMainWnd, IDC_PROCESSLIST));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case WM_NOTIFY:
|
||||||
|
{
|
||||||
|
if (((LPNMLISTVIEW)lParam)->hdr.code == LVN_ITEMCHANGED
|
||||||
|
&& (((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;
|
||||||
|
ListView_GetItem(GetDlgItem(hMainWnd, IDC_PROCESSLIST), &item);
|
||||||
|
HandleList_Update(GetDlgItem(hMainWnd, IDC_HANDLELIST), (HANDLE)item.lParam);
|
||||||
|
return TRUE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
3
rosapps/devutils/gdihv/mainwnd.h
Normal file
3
rosapps/devutils/gdihv/mainwnd.h
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
INT_PTR CALLBACK MainWindow_WndProc(HWND, UINT, WPARAM, LPARAM);
|
||||||
|
VOID MainWindow_OnSize(HWND hMainWnd);
|
94
rosapps/devutils/gdihv/proclist.c
Normal file
94
rosapps/devutils/gdihv/proclist.c
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* Gdi handle viewer
|
||||||
|
*
|
||||||
|
* proclist.c
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Timo kreuzer <timo <dot> kreuzer <at> web.de>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gdihv.h"
|
||||||
|
|
||||||
|
VOID
|
||||||
|
ProcessList_Create(HWND hListCtrl)
|
||||||
|
{
|
||||||
|
LVCOLUMN column;
|
||||||
|
|
||||||
|
column.mask = LVCF_TEXT|LVCF_FMT|LVCF_WIDTH;
|
||||||
|
column.fmt = LVCFMT_LEFT;
|
||||||
|
|
||||||
|
column.pszText = L"Process";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 0, &column);
|
||||||
|
|
||||||
|
column.pszText = L"ProcessID";
|
||||||
|
column.cx = 90;
|
||||||
|
ListView_InsertColumn(hListCtrl, 1, &column);
|
||||||
|
ProcessList_Update(hListCtrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
ProcessList_Update(HWND hListCtrl)
|
||||||
|
{
|
||||||
|
LV_ITEM item;
|
||||||
|
DWORD ProcessIds[1024], BytesReturned, cProcesses;
|
||||||
|
HANDLE hProcess;
|
||||||
|
WCHAR strText[MAX_PATH] = L"<unknown>";
|
||||||
|
INT i;
|
||||||
|
|
||||||
|
ListView_DeleteAllItems(hListCtrl);
|
||||||
|
memset(&item, 0, sizeof(LV_ITEM));
|
||||||
|
item.mask = LVIF_TEXT|LVIF_PARAM;
|
||||||
|
item.pszText = strText;
|
||||||
|
|
||||||
|
/* Insert "kernel" */
|
||||||
|
item.iItem = 0;
|
||||||
|
item.lParam = 0;
|
||||||
|
item.pszText = L"<Kernel>";
|
||||||
|
ListView_InsertItem(hListCtrl, &item);
|
||||||
|
item.pszText = strText;
|
||||||
|
wsprintf(strText, L"%#08x", 0);
|
||||||
|
ListView_SetItemText(hListCtrl, 0, 1, strText);
|
||||||
|
|
||||||
|
if (!EnumProcesses(ProcessIds, sizeof(ProcessIds), &BytesReturned ))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cProcesses = BytesReturned / sizeof(DWORD);
|
||||||
|
if (cProcesses == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (i = 0; i < cProcesses; i++)
|
||||||
|
{
|
||||||
|
wsprintf(strText, L"<unknown>");
|
||||||
|
item.lParam = ProcessIds[i];
|
||||||
|
item.iItem = ListView_GetItemCount(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]);
|
||||||
|
if (hProcess)
|
||||||
|
{
|
||||||
|
GetModuleBaseName(hProcess, NULL, (LPWSTR)strText, MAX_PATH );
|
||||||
|
CloseHandle(hProcess);
|
||||||
|
}
|
||||||
|
ListView_InsertItem(hListCtrl, &item);
|
||||||
|
|
||||||
|
wsprintf(strText, L"%#08x", ProcessIds[i]);
|
||||||
|
ListView_SetItemText(hListCtrl, item.iItem, 1, strText);
|
||||||
|
}
|
||||||
|
}
|
3
rosapps/devutils/gdihv/proclist.h
Normal file
3
rosapps/devutils/gdihv/proclist.h
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
VOID ProcessList_Create(HWND hListCtrl);
|
||||||
|
VOID ProcessList_Update(HWND hListCtrl);
|
8
rosapps/devutils/gdihv/resource.h
Normal file
8
rosapps/devutils/gdihv/resource.h
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
|
||||||
|
#define IDD_MAINWND 1000
|
||||||
|
#define IDC_PROCESSLIST 1001
|
||||||
|
#define IDC_HANDLELIST 1002
|
||||||
|
#define IDC_REFRESHHANDLE 1010
|
||||||
|
#define IDC_REFRESHPROCESS 1011
|
||||||
|
#define IDI_MAIN 2000
|
||||||
|
#define IDI_ARROW 2001
|
BIN
rosapps/devutils/gdihv/system.ico
Normal file
BIN
rosapps/devutils/gdihv/system.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 29 KiB |
Loading…
Reference in a new issue