Быстрый поиск
Введите фрагмент названия статьи для поиска
Диалоговые окна из html-файлов на Ассемблере
29.11.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Использование html-файлов для создания диалоговых окон применяется чаще всего в качестве сплэш-скринов разных триальных защит (первое, что приходит на память - протектор Armadillo и wrapper'ы от различных игровых дистрибьюторов) или в некоторых "демонстрашках", использующих графические эффекты. Плюсов тут много: вместо кропотливой низкоуровневой обработки шрифтов и цветных символов, визуальных эффектов и картинок, достаточно все это описать обычным CSS и HTML-тегами в HTML-странице, а с помощью скриптов JavaScript добавить нужную интерактивность. Кроме этого можно вынести из основного программного кода часть каких-нибудь зубодробильных вычислений на JavaScript, а потом передать результат основному приложению. У меня, например, по такому принципу написана новая версия Eval JavaScript Unpacker.Для создания окна сперва надо определить в сегменте данных некоторые значения. Главные из них - имя HTML-файла и параметры открываемого окна.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- szRes du 'res://',0
- lenRes = $-szRes-2
- szName du '/htmldialog.html',0 ; Имя html-файла в ресурсах
- szParam du 'dialogWidth:350px;dialogHeight:200px;help:off;',0
- hMoniker dd ? ; Хэндл моникера
- szUrl rb 200h ; Путь к основному файлу
Читать статью целиком »
Просмотров: 6885 | Комментариев: 28
Проверка и обнаружение зависших приложений
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
- ...
Читать статью целиком »
Просмотров: 8310 | Комментариев: 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
Читать статью целиком »
Просмотров: 13223 | Комментариев: 3
Подсказки (tooltips) в диалоговых окнах
16.09.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Еще один способ придать вашим программам профессиональный вид - использование всплывающих подсказок (tooltips), которые появляются при наведении курсора мыши на какой-нибудь элемент диалогового окна. Готовые примеры на FASM или слишком громоздкие, или недостаточно гибкие, поэтому пришлось придумывать что-то свое. Причем с самого начала поставил себе задачу сделать функции работы с подсказками как можно более универсальными, чтобы в дальнейшем их можно было легко использовать в других проектах.В сегменте данных определим все необходимые константы, переменные и структуры. Большая часть этих данных в FASM по умолчанию отсутствует, так что пришлось штудировать MSDN и другие источники и описывать их самостоятельно.
Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- hwndTip dd ? ; Хэндл окна подсказки
- TTipFlag dd ? ; Флаг активности подсказки
- ; Структура TRACKMOUSEEVENT не определена, сделаем это сами
- struct TRACKMOUSEEVENT
- cbSize dd ?
- dwFlags dd ?
- hwndTrack dd ?
- dwHoverTime dd ?
- ends
- ; Определяем нужные структуры
- tme TRACKMOUSEEVENT
- pt POINT
- ttip TOOLINFO
- trect RECT
- oldX dd ? ; Сохраненные координаты мыши
- oldY dd ?
- ; Определяем нужные константы
- TTM_TRACKACTIVATE = WM_USER + 17
- TTM_TRACKPOSITION = WM_USER + 18
- TTM_SETMAXTIPWIDTH = WM_USER + 24
- ; Сообщения окну подсказки
- TTF_SUBCLASS = 0x0010
- TTF_TRACK = 0x0020
- TTF_ABSOLUTE = 0x0080
- TTF_TRANSPARENT = 0x0100
- ; Сообщение обработчика мыши
- TME_LEAVE = 0x00000002
- ; Максимальная ширина всплывающей подсказки
- TOOLTIP_WIDTH = 200
- ; Предустановленное количество элементов в массиве подсказок
- TOOLTIPS_COUNT = 5
- ; Массив данных для всплывающих подсказок
- ; Формат массива:
- ; 1 DWORD - сохраненный адрес обработчика
- ; 2 DWORD - адрес подсказки
- tt_data rd (TOOLTIPS_COUNT*2)
Читать статью целиком »
Просмотров: 5689 | Комментариев: 10
Поле EDIT для ввода шестнадцатеричных цифр
23.08.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Поле для ввода только цифр организовать несложно, для этого достаточно просто прописать в ресурсах у нужного поля флаг ES_NUMBER. После этого с клавиатуры в это поле можно будет ввести только символ из интервала "0" - "9". Впрочем этот ничуть не мешает через Ctrl+C / Ctrl+V затолкать в него все что угодно, вплоть до непечатных бинарных данных. А как сделать поле, в которое можно вводить с клавиатуры только шестнадцатеричные цифры? Ведь там могут быть не только символы с десятичными цифрами, но и символы "A" - "F", которые также являются шестнадцатеричными цифрами. Это делается через субклассирование. Мы уже рассмотрели один пример субклассирования, превратив поле EDIT в гиперссылку, и там же определили алгоритм обработчика субклассированного элемента. Как и в прошлый раз, субклассирование должно выполняться на этапе инициализации диалогового окна.Code (Assembler) : Убрать нумерацию
- ; Сегмент данных
- section '.data' data readable writeable
- OldProc dd ? ; Адрес предыдущего обработчика
- ; Сегмент кода
- section '.code' code readable executable
- ...
- ; Субклассирование на этапе инициализации окна
- invoke GetDlgItem,[hwnddlg],ID_HEX
- ; Установить наш собственный обработчик
- invoke SetWindowLong,eax,GWL_WNDPROC,EditWindowProc
- ; Сохранить хэндл предыдущего обработчика
- mov [OldProc],eax
- ...
Читать статью целиком »
Просмотров: 6262 | Комментариев: 9