; Сегмент данных
section '.data' data readable writeable
class1 db 'Shell_TrayWnd',0 ; Название класса окна трея
class2 db 'TrayNotifyWnd',0 ; Название класса панели уведомлений
class3 db 'SysPager',0 ; Трей
class4 db 'ToolbarWindow32',0 ; Панель с иконками
; Структура для кнопки
button TBBUTTON
; Структура для пользовательских данных иконки
extra EXTRADATA
; Структура для определения имени файла процесса
ProcEntry PROCESSENTRY32
; Маска для вывода имени файла на консоль
mask db '%s',13,10,0
stdout dd ? ; Дескриптор консольного stdout
ToolbarHandle dd ? ; Хэндл окна с иконками
IconsCount dd ? ; Количество иконок в трее
ProcId dd ? ; Id процесса
ProcTrayId dd ? ; Id процесса
hProcess dd ? ; Хэндл процесса
lpData dd ? ; Указатель на блок памяти
BytesRead dd ? ; Количество прочитанных символов
buff rb 500h ; Буфер для промежуточных данных
;---------------------------------------------
section '.code' code readable executable
start:
; Получить дескриптор stout
invoke GetStdHandle,STD_OUTPUT_HANDLE
cmp eax,INVALID_HANDLE_VALUE
je exit_process
or eax,eax
jz exit_process
; Сохранить дескриптор stout
mov [stdout],eax
; Найти окно трея
invoke FindWindow,class1,NULL
or eax,eax
jz exit_process
; Найти панель уведомлений
invoke FindWindowEx,eax,NULL,class2,NULL
or eax,eax
jz exit_process
; Найти трей
invoke FindWindowEx,eax,NULL,class3,NULL
or eax,eax
jz exit_process
; Найти панель иконок в трее
invoke FindWindowEx,eax,NULL,class4,NULL
or eax,eax
jz exit_process
; Сохранить хэндл окна с иконками
mov [ToolbarHandle],eax
; Получить количество иконок в трее
invoke SendMessage,eax,TB_BUTTONCOUNT,0,0
or eax,eax
jz exit_process
; Сохранить количество иконок в трее
mov [IconsCount],eax
; Получить ID процесса-владельца трея
invoke GetWindowThreadProcessId,[ToolbarHandle],ProcId
; Открыть процесс с полным доступом
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,[ProcId]
or eax,eax
; Фокус не удался
jz exit_process
; Сохранить хэндл процесса-владельца трея
mov [hProcess],eax
; Выделить блок памяти в контексте процесса
invoke VirtualAllocEx,[hProcess],NULL,dword sizeof.TBBUTTON,MEM_COMMIT,PAGE_READWRITE
or eax,eax
jz exit_process
; Сохранить указатель на блок памяти
mov [lpData],eax
; Перебрать все иконки в трее
loc_loop:
dec [IconsCount]
; Получить иконку из трея с индексом IconsCount
invoke SendMessage,[ToolbarHandle],TB_GETBUTTON,[IconsCount],[lpData]
; Прочитать структуру иконки
invoke ReadProcessMemory,[hProcess],[lpData],button,dword sizeof.TBBUTTON,BytesRead
or eax,eax
jz exit_process
; Прочиталась вся структура?
cmp [BytesRead],sizeof.TBBUTTON
jnz exit_process
; Прочитать пользовательские данные иконки
invoke ReadProcessMemory,[hProcess],[button.dwData],extra,dword sizeof.EXTRADATA,BytesRead
or eax,eax
jz exit_process
; Прочиталась вся структура?
cmp [BytesRead],sizeof.EXTRADATA
jnz exit_process
; Это скрытая иконка?
mov eax,[extra.uID]
and eax,80000000h
or eax,eax
; Да, пропустить
jnz loc_loop
; Окно процесса существует?
invoke IsWindow,[extra.Wnd]
or eax,eax
jz loc_loop
; Получить Id процесса, чья иконка находится в трее
invoke GetWindowThreadProcessId,[extra.Wnd],ProcTrayId
; Снимок процессов системы
invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,0
mov ebx,eax
; Перебрать в цикле все процессы
mov eax,sizeof.PROCESSENTRY32
mov [ProcEntry.dwSize],eax
invoke Process32First,ebx,ProcEntry
@@:
cmp eax,FALSE
je @f
; Это нужный нам процесс?
mov eax,[ProcEntry.th32ProcessID]
cmp eax,[ProcTrayId]
je @f
; Следующий процесс
invoke Process32Next,ebx,ProcEntry
or eax,eax
jz loc_loop
jmp @b
@@:
push eax
; Закрыть хэндл
invoke CloseHandle,ebx
pop eax
; Имя файла определить не удалось
or eax,eax
jz @f
; Записать имя файла в консоль
invoke lstrlen,buff
invoke WriteConsole,[stdout],buff,eax,BytesRead,NULL
@@:
; Все иконки обработали?
cmp [IconsCount],0
ja loc_loop
; Очистить память и ресурсы
invoke VirtualFreeEx,[ProcId],[lpData],0,MEM_RELEASE
invoke CloseHandle,[ProcId]
exit_process:
; Пауза перед завершением работы
invoke Sleep,9000
include 'api\kernel32.inc'
include 'api\user32.inc'
include 'api\comctl32.inc'
include 'api\comdlg32.inc'
include 'api\shell32.inc'
include 'api\advapi32.inc'
Сообщение отредактировал Marra_Kesh - Воскресенье, 20.05.2012, 02:21