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:
Timo Kreuzer 2007-02-08 23:29:24 +00:00
parent f5dd45afa8
commit 8c6bd0b95a
14 changed files with 704 additions and 0 deletions

View 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

View 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;
}

View 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>

View 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

View 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>

View 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

View 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;
}

View file

@ -0,0 +1,4 @@
VOID HandleList_Create(HWND hListCtrl);
VOID HandleList_Update(HWND hHandleListCtrl, HANDLE ProcessID);
TCHAR* GetTypeName(UINT Type);

View 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;
}

View file

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

View 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);
}
}

View file

@ -0,0 +1,3 @@
VOID ProcessList_Create(HWND hListCtrl);
VOID ProcessList_Update(HWND hListCtrl);

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB