Быстрый поиск
Введите фрагмент названия статьи для поиска
Как узнать, что системе требуется перезагрузка после установки обновлений
14.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как узнать, что системе требуется перезагрузка после установки обновлений
Ранее я рассказывал, как можно отключить принудительную перезагрузку при установке обновлений Windows. Сегодня копнем немного глубже, а именно научимся программно определять, что система ожидает эту самую перезагрузку. Зачем это нужно? Например, такое состояние означает, что некоторые файлы из пакета обновлений установлены не до конца, а значит лучше не производить никаких рискованных действий типа массированных инсталляций.
Читать статью целиком »
Просмотров: 1982 | Комментариев: 0
Перехват и обработка Alt+Tab
13.07.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня поэкспериментируем с системными событиями. Это очень мощный и интересный инструмент, с помощью которого можно оперативно реагировать на события до того момента, как они дойдут до приложения. В качестве примера будем перехватывать окно переключения процессов, которое появляется при нажатии комбинации Alt+Tab, а также обрабатывать выбор элементов в этом окне. Начнем с описания нужных нам констант.Code (Assembler) : Убрать нумерацию
- EVENT_SYSTEM_SWITCHSTART = 0x0014
- EVENT_SYSTEM_SWITCHEND = 0x0015
- EVENT_OBJECT_FOCUS = 0x8005
- WINEVENT_OUTOFCONTEXT = 0x0000
- WINEVENT_SKIPOWNPROCESS = 0x0002
Code (Assembler) : Убрать нумерацию
- wminitdialog:
- ; Обнулить хэндл окна Alt+Tab
- mov [hwndat],0
- invoke SetWinEventHook,EVENT_SYSTEM_SWITCHSTART,EVENT_SYSTEM_SWITCHEND,\
- NULL,WinEventProc,0,0,WINEVENT_OUTOFCONTEXT+WINEVENT_SKIPOWNPROCESS
- mov [hook],eax
Читать статью целиком »
Просмотров: 1378 | Комментариев: 5
Как программно создать ярлык
08.06.2020 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ярлыки - одна из ключевых сущностей Windows. Это специальные файлы, служащие указателями на папки, программы или команды. Для управления ярлыками в Windows используется COM-объект ShellLink, точнее одна версия для ANSI и вторая для юникода. Они отличаются своими GUID. В любом из этих объектов реализовано по два интерфейса. Интерфейс IShellLink, с помощью которого можно получать и изменять свойства ярлыка, и интерфейс IPersistFile для работы непосредственно с самим файлом ярлыка.Для доступа к COM-объектам первым делом надо обозначить их GUID:
Code (Assembler) : Убрать нумерацию
- ; GUID {00021401-0000-0000-C000-000000000046}
- CLSID_ShellLink dd 00021401h
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {000214F9-0000-0000-C000-000000000046}
- IID_IShellLinkW dd 000214F9h
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
- ; GUID {0000010B-0000-0000-C000-000000000046}
- IID_IPersistFile dd 0000010Bh
- dw 0000h
- dw 0000h
- db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
Code (Assembler) : Убрать нумерацию
- ; IID_IShellLinkW Interface
- struct IShellLinkWDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetPath dd ?
- GetIDList dd ?
- SetIDList dd ?
- GetDescription dd ?
- SetDescription dd ?
- GetWorkingDirectory dd ?
- SetWorkingDirectory dd ?
- GetArguments dd ?
- SetArguments dd ?
- GetHotkey dd ?
- SetHotkey dd ?
- GetShowCmd dd ?
- SetShowCmd dd ?
- GetIconLocation dd ?
- SetIconLocation dd ?
- SetRelativePath dd ?
- Resolve dd ?
- SetPath dd ?
- ends
- ; IID_IPersistFile Interface
- struct IPersistFileDispatch
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- GetClassID dd ?
- IsDirty dd ?
- Load dd ?
- Save dd ?
- SaveCompleted dd ?
- GetCurFile dd ?
- ends
Читать статью целиком »
Просмотров: 1252 | Комментариев: 0
Вывод изображения на Ассемблере с помощью OLE
21.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Ранее я уже разбирал загрузку и вывод изображения с помощью GDI+, но это далеко не единственный способ загрузки изображения из файла. В дополнение к этой теме предлагаю рассмотреть еще один способ, как можно загрузить изображение из файла средствами OLE. Сперва пропишем GUID объекта IID_IPicture и создадим структуру для методов интерфейса IPicture. В MSDN методы перечислены в алфавитном порядке, а не так, как они фактически идут в интерфейсе, имейте это в виду.Code (Assembler) : Убрать нумерацию
- ; GUID {7BF80980-BF32-101A-8BBB-00AA00300CAB}
- IID_IPicture dd 7BF80980h
- dw 0BF32h
- dw 0101Ah
- db 08Bh, 0BBh, 0h, 0AAh, 0h, 030h, 00Ch, 0ABh
- ; IPicture Interface
- struct IPicture
- ; IUnknown
- QueryInterface dd ?
- AddRef dd ?
- Release dd ?
- ; IPicture
- get_Handle dd ?
- get_hPal dd ?
- get_Type dd ?
- get_Width dd ?
- get_Height dd ?
- Render dd ?
- set_hPal dd ?
- get_CurDC dd ?
- SelectPicture dd ?
- get_KeepOriginalFormat dd ?
- set_KeepOriginalFormat dd ?
- PictureChanged dd ?
- SaveAsFile dd ?
- get_Attributes dd ?
- SetHdc dd ?
- ends
Code (Assembler) : Убрать нумерацию
- ; Прочитать файл в память
- invoke _lopen,fname,OF_READ
- cmp eax,-1
- je loc_free_1
- mov ebx,eax
- ; Получить размер файла
- invoke GetFileSize,ebx,NULL
- mov [file_size],eax
- ; Выделить память под файл
- invoke GetProcessHeap
- mov [hProcHeap],eax
- invoke HeapAlloc,[hProcHeap],0,[file_size]
- mov [hLock],eax
- ; Загрузить картинку в память
- invoke _lread,ebx,[hLock],[file_size]
- invoke _lclose,ebx
Читать статью целиком »
Просмотров: 2927 | Комментариев: 0
Как программно свернуть все окна
04.09.2019 | Категория: Образ мышления: Assembler | Автор: ManHunter
Есть разные способы программно свернуть все открытые окна. Простой и топорный вариант решения - эмуляция нажатия клавиш Win+M, которые и выполняют команду "Свернуть все окна". Делается это через последовательность вызовов keybd_event.Code (Assembler) : Убрать нумерацию
- ; Эмуляция нажатия клавиш Win+M
- invoke keybd_event,VK_LWIN,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,'M',0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Code (Assembler) : Убрать нумерацию
- ; Эмуляция нажатия клавиш Win+Shift+M
- invoke keybd_event,VK_LWIN,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LSHIFT,0,0,NULL
- invoke Sleep,1
- invoke keybd_event,'M',0,0,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LSHIFT,0,KEYEVENTF_KEYUP,NULL
- invoke Sleep,1
- invoke keybd_event,VK_LWIN,0,KEYEVENTF_KEYUP,NULL
Читать статью целиком »
Просмотров: 1849 | Комментариев: 5