Blog. Just Blog

Быстрый поиск

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

Несколько полезных функций на Ассемблере

21.05.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter

Несколько полезных функций на Ассемблере

За время программирования на Ассемблере у меня накопилось несколько полезных решений. Выделять под каждое из них отдельную статью не хочется, а держать под рукой пригодится. Поэтому все сложу сюда, по мере надобности буду пополнять.

Читать статью целиком »
Просмотров: 29596 | Комментариев: 34

Обработка подключения и отключения съемного накопителя

18.04.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
С расширением рынка переносных устройств и USB-накопителей становится актуальной задача по обработке их взаимодействия с компьютером. Сегодня разберем обработку подключения и отключения съемных накопителей, таких как Flash-диски, карты памяти и USB-диски. Начинаем с теории. При подключении или отключении съемного накопителя система посылает всем окнам (через глобальный хэндл HWND_BROADCAST) сообщение WM_DEVICECHANGE. Но это сообщение всего лишь о самом факте изменения состояния съемного накопителя, а более подробные значения содержатся в параметрах lParam и wParam этого сообщения. В wParam приходит расшифровка произошедшего события: подключение, отключение, изменения состояния, отмена отключения и т.п. Нас пока интересует только два: DBT_DEVICEARRIVAL - подключение сменного накопителя и DBT_DEVICEREMOVECOMPLETE - извлечение накопителя. Основной обработчик событий приложения ничем не отличается от обычных обработчиков. Нам также понадобятся несколько констант, которые по умолчанию не определены в FASM:
  1. DBT_DEVICEARRIVAL        = 0x8000
  2. DBT_DEVICEREMOVECOMPLETE = 0x8004
  3.  
  4. DBT_DEVTYP_VOLUME        = 0x00000002
И, собственно, сам обработчик. Я оставил только нужные фрагменты кода:
  1. proc DialogProc hwnddlg,msg,wparam,lparam
  2.         push    ebx esi edi
  3.         ...
  4.         ; Пришло сообщение об изменении состояния съемного накопителя
  5.         cmp     [msg],WM_DEVICECHANGE
  6.         je      update_usb
  7.         ...
  8. update_usb:
  9.         ; Устройство подключено?
  10.         cmp     [wparam],DBT_DEVICEARRIVAL
  11.         je      usb_connected
  12.  
  13.         ; Устройство извлечено?
  14.         cmp     [wparam],DBT_DEVICEREMOVECOMPLETE
  15.         je      usb_disconnected
  16.  
  17.         jmp     processed
  18.  
  19. usb_connected:
  20.         ; Обработка подключения устройства
  21.         ...
  22.         jmp     processed
  23.  
  24. usb_disconnected:
  25.         ; Обработка отключения устройства
  26.         ...
  27.         jmp     processed
  28.         ...
  29. processed:
  30.         mov     eax,1
  31. finish:
  32.         pop     edi esi ebx
  33.         ret
  34. endp
Для полноты картины осталось узнать, какой именно диск был подключен или извлечен. В параметре lParam сообщения WM_DEVICECHANGE передается указатель на структуру, которая содержит подробную информацию о случившемся событии. FASM про нее тоже ничего не знает, поэтому придется и ее описать самостоятельно.

Читать статью целиком »
Просмотров: 7555 | Комментариев: 19

Splash-окно при загрузке программы

31.03.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
При запуске некоторых приложений иногда требуется выполнить какие-нибудь ресурсоемкие или продолжительные по времени действия, например, загрузка дополнительных модулей, сбор информации о системе, распаковка файлов данных и т.п. Часто во время таких процессов открывается так называемое splash-окно (его также называют "сплэш-окно" или сокращенно "сплэш"), то есть модальное окно без заголовка, расположенное по центру экрана, обычно с логотипом и названием программы. Также в нем меняющейся строкой отображается текущее действие программы, и, иногда, полоса прогресса выполнения. Таким образом пользователя как бы уведомляют, что программа не зависла при запуске, а просто выполняет нужные ей действия и надо немного подождать. После появления главного окна программы сплэш закрывается. Попробуем сделать что-нибудь подобное на Ассемблере.

Сперва нарисуем само окно. Оно должно быть без заголовка, модальное, можно разместить на нем картинку-логотип. Для большего эффекта добавим на это окно прогрессбар и текстовое поле для отображения состояния загрузки.
  1. ; Стиль прогрессбара - непрерывный бегунок. В FASM значение не определено,
  2. ; сделаем это самостоятельно
  3. PBS_MARQUEE = 8
  4.  
  5. dialog demonstration,' Splash Demo',0, 0, 150, 60,\
  6.     WS_POPUP+DS_CENTER+DS_SYSMODAL+WS_BORDER, WS_EX_TOOLWINDOW,0,'Arial',10
  7.   dialogitem 'STATIC',1, 1, 0, 0, 138, 38 ,WS_VISIBLE+SS_BITMAP
  8.   dialogitem 'STATIC','Loading...',ID_TEXT, 0, 34, 150, 8 ,WS_VISIBLE+SS_CENTER
  9.   dialogitem 'msctls_progress32', '', IDC_PROGRESS, 3, 47, 145, 10,\
  10.     WS_VISIBLE+PBS_MARQUEE
  11.   dialogitem 'BUTTON','',IDCANCEL, 0, 0, 0, 0, 0
  12. enddialog
Несколько комментариев к коду. Прогрессбар задается в ресурсах как элемент диалогового окна msctls_progress32 со стилем PBS_MARQUEE, то есть он будет непрерывно двигаться. Если требуется указание более точного процента выполнения загрузки, то придется обратиться к документации. Скрытая кнопка EXIT предназначена для того, чтобы splash-окно можно было закрыть при помощи клавиши Esc. Как правило, разработчики пренебрегают возможностью закрывать сплэш по желанию пользователя, и посреди экрана висит уродливое окно, которое нельзя ни закрыть, ни передвинуть, пока приложение не загрузится. Никогда так не делайте! Также обратите внимание, чтобы заработал такой прогрессбар, должна быть вызвана функция InitCommonControls, а исполняемый файл должен содержать соответствующий манифест.

Читать статью целиком »
Просмотров: 7633 | Комментариев: 10

"FASM и UPX: созданы друг для друга"

25.03.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сразу скажу, утро и кофе к этой статье отношения не имеют, все необычные решения приходят ко мне обычно по ночам. Однажды я экспериментировал с FASM, и обнаружил один интересный момент. Ниже приведен ассемблерный листинг самой простейшей программы, она выводит на экран сообщение и сразу же завершает работу, вроде бы ничего необычного.
  1. section '.code' code readable executable
  2.  
  3.   start:
  4.         ; Вывести окно сообщения и выйти из программы
  5.         invoke  MessageBox, NULL, szMess, szTitle, MB_OK
  6.         invoke  ExitProcess,0
  7.  
  8.         ; Куча пустого места, чтобы можно было упаковать файл
  9.         rd      1000h
  10.  
  11. szTitle db      'Title',0
  12. szMess  db      'Hello, UPX ;)',0
  13.  
  14. ;---------------------------------------------
  15.  
  16. section '.idata' import data readable writeable
  17.  
  18. ; Обратите внмание, user32.dll прописан дважды
  19. library kernel32,'kernel32.dll',\
  20.         user32,'user32.dll',\
  21.         user32,'user32.dll'
  22.  
  23. include 'apia\kernel32.inc'
  24. include 'apia\user32.inc'
Но обратите внимание, что в секции импорта user32.dll прописан дважды. Это и есть та самая фишка, которую я случайно обнаружил. Блок нулевых байт в середине нужен, чтобы файл получился большой и его можно было упаковать. В реальных приложениях, скорее всего, такие избыточные данные не понадобятся.

Читать статью целиком »
Просмотров: 6512 | Комментариев: 10

Управление лотком CD-ROM на Ассемблере

06.02.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Открывать и закрывать лоток CD-ROM можно программными способами. Это может оказаться полезным в случаях, когда системный блок стоит в труднодоступном месте или по каким-либо иным причинам нет возможности управлять им при помощи механической кнопки. Также я читал истории, когда на лоток CD-ROM возлагались полезные функции, например, при выдвижении он замыкал контакты питания и отправлял сервер в перезагрузку, а администратор таким образом удаленно управлял им. Так что программное управление лотком CD-ROM имеет место быть, и наша задача научиться его делать. Чаще всего в разных интернетах описывается способ управления при помощи MCI (Media Control Interface). Кстати, именно этот способ приводится в качестве одного из примеров программ в пакете FASM.
  1.         ...
  2.         ; Открыть лоток CD-ROM
  3.         invoke  mciSendString,cmd_open,0,0,0
  4.         invoke  mciSendString,cmd_eject,0,0,0
  5.         invoke  mciSendString,cmd_close,0,0,0
  6.         ...
  7.         ; Закрыть лоток CD-ROM
  8.         invoke  mciSendString,cmd_open,0,0,0
  9.         invoke  mciSendString,cmd_load,0,0,0
  10.         invoke  mciSendString,cmd_close,0,0,0
  11.         ...
  12. cmd_open   db 'open cdaudio',0
  13. cmd_eject  db 'set cdaudio door open',0
  14. cmd_load   db 'set cdaudio door closed',0
  15. cmd_close  db 'close cdaudio',0
У данного метода есть недостатки. Главный заключается в том, что при наличии в системе нескольких приводов CD-ROM нет возможности указать, лоток которого из них необходимо выдвигать, всегда открывается первый по счету. Второй существенный недостаток - некоторые антивирусы считают наличие таких функций в программах потенциально опасными. Видимо из-за того, что иногда несанкционированное открытие лотка CD-ROM используется в различных программах-шутках для окошмаривания доверчивых пользователей.

Читать статью целиком »
Просмотров: 10555 | Комментариев: 6

01 ... 63 64 65 66 67 68 69 ... 78
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0264 сек.) / Память: 4.5 Mb
Наверх