#include "stdafx.h"
#include < windows.h >
#include < Commctrl.h >
#include < conio.h >
void EnumerateDesktopItems();
int _tmain()
{
EnumerateDesktopItems();
printf("\n\nAny key...");
getch();
return 0;
}
HWND GetDesktopListViewHandle()
{
HWND hwnd = FindWindow("Progman", NULL);
hwnd = GetWindow(hwnd, GW_CHILD);
hwnd = GetWindow(hwnd, GW_CHILD);
LPTSTR pClassName = (LPTSTR) calloc(1, MAX_PATH);
int bufsize = GetClassName(hwnd, pClassName, MAX_PATH);
if (_stricmp(pClassName, "SysListView32") != 0)
{
hwnd = (HWND)0;
}
free(pClassName);
return hwnd;
}
LPVOID AllocProcessMem(HANDLE hProcess, SIZE_T size)
{
return VirtualAllocEx(
hProcess,
NULL,
size,
MEM_COMMIT,
PAGE_READWRITE);
}
void FreeProcessMem(HANDLE hProcess, LPVOID address)
{
VirtualFreeEx(
hProcess,
address,
0,
MEM_RELEASE);
}
void EnumerateDesktopItems()
{
HWND hwndListView = GetDesktopListViewHandle();
if (!IsWindow(hwndListView)) return;
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hwndListView, &dwProcessId);
HANDLE hProcess = OpenProcess(
PROCESS_ALL_ACCESS,
FALSE,
dwProcessId);
if (!hProcess) return;
LVITEM lvi = {0};
lvi.cchTextMax=MAX_PATH;
char item[MAX_PATH], subitem[MAX_PATH];
POINT point;
LVITEM * _lvi = (LVITEM*) AllocProcessMem(hProcess, sizeof(LVITEM));
LPTSTR _item = (LPTSTR) AllocProcessMem(hProcess, MAX_PATH);
LPTSTR _subitem = (LPTSTR) AllocProcessMem(hProcess, MAX_PATH);
POINT* _point = (POINT*) AllocProcessMem(hProcess, sizeof(POINT));
int count = ListView_GetItemCount(hwndListView);
for (int itemIndex=0; itemIndex < count; itemIndex++)
{
lvi.iSubItem=0;
lvi.pszText=_item;
WriteProcessMemory(
hProcess,
_lvi,
&lvi,
sizeof(LVITEM),
NULL);
SIZE_T size = SendMessage(
hwndListView,
LVM_GETITEMTEXT,
(WPARAM)itemIndex,
(LPARAM)_lvi);
ReadProcessMemory(
hProcess,
_item,
item,
MAX_PATH,
NULL);
SendMessage(
hwndListView,
LVM_GETITEMPOSITION,
(WPARAM)itemIndex,
(LPARAM)_point);
ReadProcessMemory(
hProcess,
_point,
&point,
sizeof(POINT),
NULL);
printf("%d. %s - [x=%d, y=%d]\n",
itemIndex+1,
item,
point.x,
point.y);
for (int subItemIndex=1; subItemIndex <= 3; subItemIndex++)
{
lvi.iSubItem=subItemIndex;
lvi.pszText=_subitem;
WriteProcessMemory(
hProcess,
_lvi,
&lvi,
sizeof(LVITEM),
NULL);
size = SendMessage(
hwndListView,
LVM_GETITEMTEXT,
(WPARAM)itemIndex,
(LPARAM)_lvi);
if (size)
{
ReadProcessMemory(
hProcess,
_subitem,
subitem,
MAX_PATH,
NULL);
printf("\t- (%d) %s\n", subItemIndex, subitem);
}
}
}
FreeProcessMem(hProcess, _point);
FreeProcessMem(hProcess, _subitem);
FreeProcessMem(hProcess, _item);
FreeProcessMem(hProcess, _lvi);
CloseHandle(hProcess);
}
|