
Быстрый поиск
Введите фрагмент названия статьи для поиска

Управление клавишами 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
Читать статью целиком »
Просмотров: 13338 | Комментариев: 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)
Читать статью целиком »
Просмотров: 5761 | Комментариев: 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
- ...
Читать статью целиком »
Просмотров: 6340 | Комментариев: 9

gzuncompress и gzinflate: Assembler vs PHP
11.08.2009 | Категория: Темная сторона Силы | Автор: ManHunter
При разработке проекта Massacre возникла необходимость реализовать функции распаковки PHP-кода на Ассемблере. В этой статье я распишу все выкладки по этому вопросу. Кому-нибудь пригодится - хорошо, не пригодится - оставлю для себя, чтобы не забыть. Как всегда, начнем с теории. Функции gzuncompress и gzinflate обратны к функциям gzcompress и gzdeflate, соответственно. Все они используют алгоритм сжатия LZW, который также используется в бесплатной библиотеке zlib. Сперва скачаем эту библиотеку и воспользуемся Ассемблером, чтобы сжать какую-нибудь эталонную строку.Code (Assembler) : Убрать нумерацию
- format PE GUI 4.0
- entry start
- include 'win32a.inc'
- section '.data' data readable writeable
- strr db 'ManHunter' ; Строка для компрессии
- lend = $-strr
- bsize = 1000
- blen dd bsize
- tmp rb bsize
- tmp2 rb bsize
- tmp3 rb bsize
- mask db '%.2X ',0
- ;----------------------------------------------------------
- section '.code' code readable executable
- start:
- invoke compress,tmp,blen,strr,dword lend
- mov ecx,[blen]
- mov esi,tmp
- @@:
- push ecx
- movzx eax,byte [esi]
- invoke wsprintf,tmp2,mask,eax
- add esp,12
- invoke lstrcat,tmp3,tmp2
- inc esi
- pop ecx
- loop @b
- invoke MessageBox,HWND_DESKTOP,tmp3,NULL,MB_OK
- invoke ExitProcess,0
- ;----------------------------------------------------------
- section '.idata' import data readable writeable
- library kernel32,"kernel32.dll",\
- user32,"user32.dll",\
- zlib,"zlib1.dll"
- include "apia\kernel32.inc"
- include "apia\user32.inc"
- import zlib,\
- compress,'compress'
78 9C F3 4D CC F3 28 CD 2B 49 2D 02 00 11 11 03 93
Часть строки я специально выделил красным цветом, дальше будет понятно зачем это сделано.
Читать статью целиком »
Просмотров: 6340 | Комментариев: 6

Создание диалоговых окон с тенью
03.08.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем очередное украшательство для ваших программ, а именно тень от диалоговых окон. Обычная тень создается штатными средствами системы, но поддерживается только начиная с Windows XP. Для этого требуется, чтобы стиль окна включал в себя флаг CS_DROPSHADOW, и здесь есть одна тонкость: этот флаг нельзя прописать в ресурсах, а надо устанавливать при инициализации диалогового окна. В обработчике инициализации должен быть такой код:Code (Assembler) : Убрать нумерацию
- ...
- ; Определить константу CS_DROPSHADOW
- CS_DROPSHADOW = 00020000h
- ; Получить текущее значение стиля окна
- invoke GetWindowLong,[hwnddlg],GCL_STYLE
- ; Добавить к нему атрибут тень
- or eax,CS_DROPSHADOW
- ; Установить новый стиль окна
- invoke SetClassLong,[hwnddlg],GCL_STYLE,eax
- ...
Читать статью целиком »
Просмотров: 6733 | Комментариев: 1
