mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +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