
Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Установка окна по центру экрана
05.01.2010 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы создаваемое диалоговое окно отображалось в самом центре экрана, его надо создать с атрибутом стиля DS_CENTER. Но иногда требуется отцентровать уже созданное или чужое окно. Для этого я написал небольшую функцию, устанавливающую выбранное окно по центру экрана, с некоторыми дополнительными возможностями. Функция самодостаточна, не требует дополнительных переменных в сегменте данных, корректно работает с любыми окнами, пропуская развернутые на весь экран.Code (Assembler) : Убрать нумерацию
- ;-------------------------------------------------------------------------
- ; Процедура перемещения окна в центр экрана. Если окно развернуто или
- ; его размеры превышают размеры экрана, то окно не перемещается
- ; Параметры:
- ; hwnd - хэндл окна
- ; mode - относительно каких координат центровать окно (1 - только
- ; рабочая область экрана с учетом размеров панели задач и
- ; различных тулбаров, 0 - относительно размеров всего экрана)
- ;-------------------------------------------------------------------------
- proc WindowToCenter hwnd:DWORD, mode:DWORD
- ; Локальные переменные, они же структура RECT
- local left :DWORD
- local top :DWORD
- local right :DWORD
- local bottom :DWORD
- ; Сохранить все регистры
- pusha
- ; Такое окно существует?
- invoke IsWindow,[hwnd]
- or eax,eax
- jz .loc_ret
- ; Окно развернуто на весь экран?
- invoke IsZoomed,[hwnd]
- or eax,eax
- jnz .loc_ret
- ; Получить размеры окна
- lea eax,[left]
- invoke GetWindowRect,[hwnd],eax
- ; Флаги функции SetWindowPos
- push SWP_NOSIZE+SWP_NOZORDER
- push NULL
- push NULL
- ; Какие размеры экрана получать
- mov eax,SM_CYSCREEN ; Вся экранная область
- cmp [mode],0
- je @f
- mov eax,SM_CYFULLSCREEN ; Рабочая область экрана
- @@:
- ; Получить высоту экрана
- invoke GetSystemMetrics,eax
- mov ecx,[bottom]
- sub ecx,[top]
- ; Высота окна больше высоты экрана?
- cmp ecx,eax
- jbe @f
- ; Почистить стек и на выход
- add esp,12
- jmp .loc_ret
- @@:
- sub eax,ecx
- shr eax,1
- ; Новая координата Y
- push eax
- ; Какие размеры экрана получать
- mov eax,SM_CXSCREEN ; Вся экранная область
- cmp [mode],0
- je @f
- mov eax,SM_CXFULLSCREEN ; Рабочая область экрана
- @@:
- ; Получить ширину экрана
- invoke GetSystemMetrics,eax
- mov ecx,[right]
- sub ecx,[left]
- ; Ширина окна больше ширины экрана?
- cmp ecx,eax
- jbe @f
- ; Почистить стек и на выход
- add esp,16
- jmp .loc_ret
- @@:
- sub eax,ecx
- shr eax,1
- ; Новая координата X
- push eax
- ; Разместить окно по центру экрана
- invoke SetWindowPos,[hwnd],NULL
- .loc_ret:
- ; Восстановить все регистры
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 9052 | Комментариев: 4
Эффект бегущей строки на Ассемблере
14.12.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередной интересный визуальный эффект для ваших программ - бегущая строка. Обычно подобный эффект используется в различных кейгенах, но вполне может пригодиться и для более мирных приложений. В качестве основы взята ассемблерная библиотека Scroller lib 1.01 от ReWolf / HTBTeam. Изначально она предназначалась для MASM, так что пришлось ее портировать под FASM. В процессе переноса библиотека была немного переработана и дополнена, а также упрощена ее структура и подключение к проектам. Сперва в сегменте данных определяются вспомогательные константы и структура для создания скроллера.Code (Assembler) : Убрать нумерацию
- ; Константы, определяющие режим скроллера
- SCROLL_START = 0 ; Скроллер запущен
- SCROLL_PAUSE = 1 ; Скроллер на паузе
- SCROLL_STOP = 2 ; Скроллер полностью остановлен
- ; Структура для скроллера
- struct SCROLLSTRUCT
- ; Значения заполняются пользователем
- hwDlg dd ? ; Хэндл окна для скроллера
- hFont dd ? ; Шрифт скроллера
- ddWidth dd ? ; Ширина скроллера
- X dd ? ; Координата X
- Y dd ? ; Координата Y
- lpstrText dd ? ; Строка скроллера ASCIIZ
- ddTxtColor dd ? ; Цвет текста скроллера
- ddBkgColor dd ? ; Цвет фона скроллера
- ddSpeed dd ? ; Скорость движения
- dbMode db ? ; Режим скроллера
- ; Внутренние переменные
- ddROP dd ?
- hBkgDC dd ?
- hTxtBmp dd ?
- hTmpBmp dd ?
- hBakTmpBmp dd ?
- hInDC dd ?
- ddHeight dd ?
- ddPos dd ?
- ddTxtWidth dd ?
- ends
Читать статью целиком »
Просмотров: 8856 | Комментариев: 5
Диалоговые окна из html-файлов на Ассемблере
29.11.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter

Диалоговые окна из html-файлов на Ассемблере
Использование html-файлов для создания диалоговых окон применяется чаще всего в качестве сплэш-скринов разных триальных защит (первое, что приходит на память - протектор Armadillo и wrapper'ы от различных игровых дистрибьюторов) или в некоторых "демонстрашках", использующих графические эффекты. Плюсов тут много: вместо кропотливой низкоуровневой обработки шрифтов и цветных символов, визуальных эффектов и картинок, достаточно все это описать обычным CSS и HTML-тегами в HTML-странице, а с помощью скриптов JavaScript добавить нужную интерактивность. Кроме этого можно вынести из основного программного кода часть каких-нибудь зубодробильных вычислений на JavaScript, а потом передать результат основному приложению. У меня, например, по такому принципу написана новая версия Eval JavaScript Unpacker.
Читать статью целиком »
Просмотров: 7277 | Комментариев: 32
Проверка и обнаружение зависших приложений
27.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда для работы требуется определение зависших приложений, окна которых не отвечают на сообщения. Для этого есть два способа. Первый - официально документированный, через функцию SendMessageTimeOut. Особенность ее работы заключается в том, что после отправки сообщения окну она ждет ответ заданное время, и, если ответа от приложения не последовало, то возвращает FALSE. Вот пример использования функции. Нужные константы, как обычно, в FASM не определены, пришлось брать их из других источников.Code (Assembler) : Убрать нумерацию
- ...
- ; Определить таймаут 50 миллисекунд
- TIMEOUT = 50
- ; Определить константу SMTO_ABORTIFHUNG
- SMTO_ABORTIFHUNG = 2
- ; hwnd - хэндл проверяемого окна
- invoke SendMessageTimeout,[hwnd],NULL,0,0,SMTO_ABORTIFHUNG,TIMEOUT,NULL
- ; Если вернулся 0, то приложение "висит"
- or eax,eax
- jz app_hung_up
- ...
Читать статью целиком »
Просмотров: 8672 | Комментариев: 2
Управление клавишами NumLock, CapsLock и ScrollLock
07.10.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Иногда в программах требуется получать состояние управляющих клавиш или изменять их состояние. Во времена MS-DOS достаточно было просто прочитать или записать значение WORD по определенному адресу памяти, при этом светодиодные индикаторы клавиатуры реагировали на это включением или выключением. Были очень популярны крохотные, в несколько байт, программы для выключения NumLock при загрузке системы, типа таких:Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------
- ; Программа для выключения индикатора NumLock под MS-DOS
- ; Размер .com-файла после компиляции 9 байт
- ;-----------------------------------------------------------
- .286
- .model tiny
- .code ; Сегмент кода
- org 100h ; Зарезервировано для PSP
- start:
- pop ax ; После запуска в стеке 0, AX=0
- mov ds,ax ; DS=0
- mov ds:[417h],ax ; WORD DS:[417h] - состояние *Lock'ов
- int 20h ; Выход из программы
- end start
Читать статью целиком »
Просмотров: 13857 | Комментариев: 3


