Быстрый поиск
Введите фрагмент названия статьи для поиска
Получение списка удаленных файлов в Корзине
22.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Удалять файлы в Корзину мы уже научились, теперь давайте разберем, как можно получить список удаленных объектов, которые в этой Корзине находятся. С чего начнем? Ну конечно же с описания кучи структур, интерфейсов и констант, которые нам понадобятся.Code (Assembler) : Убрать нумерацию
- ; GUID {43826D1E-E718-42EE-BC55-A1E261C37BFE}
- IID_IShellItem dd 043826D1Eh
- dw 0E718h
- dw 042EEh
- db 0BCh, 055h, 0A1h, 0E2h, 061h, 0C3h, 07Bh, 0FEh
- ; GUID {93F2F68C-1D1B-11D3-A30E-00C04F79ABD1}
- IID_IShellFolder2 dd 093F2F68Ch
- dw 01D1Bh
- dw 011D3h
- db 0A3h, 00Eh, 000h, 0C0h, 04Fh, 079h, 0ABh, 0D1h
- ; IID_IShellFolder2 Interface
- struct IShellFolder2
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IShellFolder
- ParseDisplayName dd ?
- EnumObjects dd ?
- BindToObject dd ?
- BindToStorage dd ?
- CompareIDs dd ?
- CreateViewObject dd ?
- GetAttributesOf dd ?
- GetUIObjectOf dd ?
- GetDisplayNameOf dd ?
- SetNameOf dd ?
- ; IShellFolder2
- GetDefaultSearchGUID dd ?
- EnumSearches dd ?
- GetDefaultColumn dd ?
- GetDefaultColumnState dd ?
- GetDetailsEx dd ?
- GetDetailsOf dd ?
- MapColumnToSCID dd ?
- ends
- ; IID_IEnumIDList Interface
- struct IEnumIDList
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- Next dd ?
- Skip dd ?
- Reset dd ?
- Clone dd ?
- ends
- struct STRRET
- uType dd ?
- union
- pOleStr dd ?
- uOffset dd ?
- cStr rb 260
- ends
- ends
- struct SHCOLUMNID
- fmtid rb 16
- pid dd ?
- ends
- S_OK = 0
- CSIDL_BITBUCKET = 0Ah
- SHCONTF_FOLDERS = 20h
- SHCONTF_NONFOLDERS = 40h
- SHGDN_NORMAL = 0
- SHGDN_INFOLDER = 1
- SHGDN_FOREDITING = 1000h
- SHGDN_FORPARSING = 8000h
- PID_DISPLACED_FROM = 2
- PID_DISPLACED_DATE = 3
- PKEY_SIZE = 12
- PSGUID_DISPLACED dd 09B174B33h
- dw 040FFh
- dw 011D2h
- db 0A2h, 07Eh, 000h, 0C0h, 04Fh, 0C3h, 008h, 071h
- PKEY_Size dd 0B725F130h
- dw 047EFh
- dw 0101Ah
- db 0A5h, 0F1h, 002h, 060h, 08Ch, 09Eh, 0EBh, 0ACh
Code (Assembler) : Убрать нумерацию
- ; Инициализировать COM-объект
- invoke CoInitialize,NULL
- invoke SHGetSpecialFolderLocation,NULL,CSIDL_BITBUCKET,pidl
- invoke SHGetDesktopFolder,psfDesktop
- ; Получить объект папки Корзины
- mov eax,[psfDesktop]
- mov eax,[eax]
- stdcall dword [eax+IShellFolder2.BindToObject],[psfDesktop],\
- [pidl],NULL,IID_IShellFolder2,psfRecycleBin
- ; Обработать содержимое Корзины
- mov eax,[psfRecycleBin]
- mov eax,[eax]
- stdcall dword [eax+IShellFolder2.EnumObjects],[psfRecycleBin],\
- NULL,SHCONTF_FOLDERS+SHCONTF_NONFOLDERS,peidl
- loc_next:
- ; Очередной элемент содержимого Корзины
- mov eax,[peidl]
- mov eax,[eax]
- stdcall dword [eax+IEnumIDList.Next],[peidl],1,pidlItem,NULL
- ; Больше ничего нет
- or eax,eax
- jnz loc_done
- ; Выполнить необходимые действия с объектом
- ...
- ...
- ...
- jmp loc_next
- loc_done:
- ; Прибраться за собой
- mov eax, [psfRecycleBin]
- mov eax, [eax]
- stdcall dword [eax+IShellFolder2.Release],[psfRecycleBin]
- mov eax, [psfDesktop]
- mov eax, [eax]
- stdcall dword [eax+IShellFolder2.Release],[psfDesktop]
- invoke CoTaskMemFree,[pidl]
- ; Удалить объект
- invoke CoUninitialize
Читать статью целиком »
Просмотров: 1349 | Комментариев: 7
Delayed Start 1.6
20.08.2020 | Категория: Мои программы | Автор: ManHunter
Скриншот программы Delayed Start
Программа для запуска других приложений с заданной задержкой. Кроме собственно запуска может автоматически прятать окно запущенного приложения, что особенно полезно для консольных программ. Дополнительно программа Delayed Start может быть использована, когда требуется выдержать нужную паузу в командных файлах. Для этого достаточно указать только время задержки без имени запускаемого приложения. Я использую Delayed Start в автозагрузке, чтобы "тяжелые" программы запускались не все одновременно, сильно нагружая систему, а по очереди и в нужной мне последовательности.
Для использования в командных файлах предусмотрены следующие коды возврата:
errorlevel = 1 - запуск произведен успешно или запуск вообще не выполнялся (пауза)
errorlevel = 0 - при запуске произошла ошибка
Для отладки запуска программ с разными параметрами в архиве прилагается файлик test.exe. Он просто выводит окно со своей командной строкой.
Читать статью целиком »
Просмотров: 17242 | Комментариев: 58
Программное удаление файла в Корзину
18.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой сниппет - удаление файла или группы файлов в Корзину. Делается это при помощи функции SHFileOperation, но сперва нам надо будет определить необходимую структуру SHFILEOPSTRUCT и несколько констант.Code (Assembler) : Убрать нумерацию
- struct SHFILEOPSTRUCT
- hwnd dd ?
- wFunc dd ?
- pFrom dd ?
- pTo dd ?
- fFlags dw ?
- fAnyOperationsAborted dd ?
- hNameMappings dd ?
- lpszProgressTitle dd ?
- ends
- FO_DELETE = 3h
- FOF_ALLOWUNDO = 40h
- FOF_NOCONFIRMATION = 10h
- FOF_SILENT = 4h
Code (Assembler) : Убрать нумерацию
- mov [fos.hwnd],HWND_DESKTOP
- mov [fos.wFunc],FO_DELETE
- mov [fos.pFrom],fname
- mov [fos.fFlags],FOF_ALLOWUNDO+FOF_NOCONFIRMATION+FOF_SILENT
- invoke SHFileOperation,fos
Читать статью целиком »
Просмотров: 1275 | Комментариев: 6
Использование мультимедийного таймера
16.08.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Интересная разновидность системных событий - высокоточный мультимедийный таймер. Гарантированный интервал срабатывания мультимедийных таймеров - около 10 миллисекунд против 50 миллисекунд обычных таймеров, устанавливаемых при помощи функции SetTimer. Кроме того, мультимедийные таймеры позволяют использовать обработчики, которые будут срабатывать в нужные интервалы, тогда как сообщения WM_TIMER от обычных таймеров идут через общую очередь. Если главный поток подвис, заснул или продолжительное время реагирует на какое-нибудь тяжелое сообщение, то таймеру придется ожидать, пока обработчик дойдет до него. Таким образом, добиться предсказуемой периодичности таймера будет очень сложно. Мультимедийные таймеры выполняются в собственном потоке, поэтому лишены перечисленных недостатков.Слова словами, но давайте проверим это на практике. Для этого в простом оконном приложении установим обычный таймер на интервал 1 миллисекунду, вместе с этим создадим мультимедийный таймер с таким же интервалом срабатывания. При каждом срабатывании каждого из этих таймеров будет увеличен соответствующий счетчик. По истечении определенного времени, например, 5 секунд, сравним результаты.
Обработчик окна будет выглядеть примерно так. Для удобства я оставил только минимально необходимый код.
Code (Assembler) : Убрать нумерацию
- cmp [msg],WM_INITDIALOG
- je wminitdialog
- cmp [msg],WM_TIMER
- je wmtimer
- ...
- ...
- wminitdialog:
- ; Обнулить счетчики
- mov [dCntTim],0
- mov [dCntMM],0
- ; Получить начальное время
- invoke GetTickCount
- mov [dTime],eax
- ; Установить обычный таймер на интервал 1 мс
- invoke SetTimer,[hwnddlg],1,1,NULL
- ; Установить мультимедийный таймер на интервал 1 мс
- TIME_PERIODIC = 0x0001
- invoke timeSetEvent,1,1,TimeProc,777,TIME_PERIODIC
- ...
- ...
- wmtimer:
- ; Увеличить счетчик по событию WM_TIMER
- inc [dCntTim]
- ; Прошло 5 секунд?
- invoke GetTickCount
- sub eax,[dTime]
- cmp eax,5000
- jb processed
- jmp wmclose
- wmclose:
- ; Удалить оба счетчика
- invoke KillTimer,[hwnddlg],1
- invoke timeKillEvent,[hTimer]
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Обработчик высокоточного таймера
- ;-----------------------------------------------------------
- proc TimeProc uTimerID:DWORD,uMsg:DWORD,dwUser:DWORD,dw1:DWORD,dw2:DWORD
- ; Увеличить счетчик по системному событию
- inc [dCntMM]
- ret
- endp
Читать статью целиком »
Просмотров: 1312 | Комментариев: 4
Передача данных приложению с помощью WM_DROPFILES
09.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обрабатывать перетаскивание файлов в окно программы мы уже умеем, а сегодня узнаем, как сэмулировать это действие, то есть передать стороннему приложению список файлов через отправку сообщения WM_DROPFILES.Начинаем с описания структуры DROPFILES, потому что FASM про нее ничего не знает. Так часто приходится писать подобное, что впору уже вводить какую-нибудь аббревиатуру, типа "Самостоятельно Описываем Структуры, Недостающие Интерфейсы, Константы Ассемблера" - "С.О.С.Н.И.К.А". Шутка.
Code (Assembler) : Убрать нумерацию
- struct DROPFILES
- pFiles dd ?
- pt POINT
- fNC dd ?
- fWide dd ?
- ends
Ну и сам код. Определяем размер и выделяем память, заполняем структуру и имена файлов, отправляем сообщение целевому окну.
Code (Assembler) : Убрать нумерацию
- ; Размер структуры DROPFILES
- mov ebx,sizeof.DROPFILES
- inc ebx
- ; Длина имени первого файла
- invoke lstrlen,file1
- add ebx,eax
- inc ebx
- ; Длина имени второго файла
- invoke lstrlen,file2
- add ebx,eax
- inc ebx
- ; Выделить память
- invoke GlobalAlloc,GMEM_SHARE+GMEM_MOVEABLE+GMEM_ZEROINIT,ebx
- mov [mem],eax
- invoke GlobalLock,eax
- mov [dfiles],eax
- ; Заполнить структуру DROPFILES
- mov edi,[dfiles]
- mov [edi+DROPFILES.pFiles],sizeof.DROPFILES
- mov [edi+DROPFILES.pt.x],0
- mov [edi+DROPFILES.pt.y],0
- mov [edi+DROPFILES.fNC],FALSE
- mov [edi+DROPFILES.fWide],FALSE
- add edi,sizeof.DROPFILES
- ; Дописать к ней передаваемые файлы
- mov esi,file1
- @@:
- lodsb
- stosb
- or al,al
- jnz @b
- mov esi,file2
- @@:
- lodsb
- stosb
- or al,al
- jnz @b
- ; Завершающий нулевой байт
- xor eax,eax
- stosb
- ; Отправить сообщение WM_DROPFILES
- invoke GlobalUnlock,[mem]
- invoke PostMessage,[destination_window],WM_DROPFILES,[mem],0
- invoke GlobalFree,[mem]
Читать статью целиком »
Просмотров: 1197 | Комментариев: 1