Blog. Just Blog

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

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

Добавление пунктов в системное меню окна

05.11.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Некоторые программы добавляют свои пункты меню в стандартное системное меню, которое появляется при клике на иконку окна. Как это делается? Очень просто. При инициализации окна или при наступлении каких-либо определенных условий выполняется примерно следующий код:
  1.         ; Получить хэндл системного меню окна
  2.         invoke  GetSystemMenu,[hwnddlg],0
  3.         mov     ebx,eax
  4.  
  5.         ; Добавить в меню полосу разделителя
  6.         invoke  InsertMenu,ebx,2,MF_BYPOSITION,0,0
  7.  
  8.         ; Идентификаторы сообщений при выборе пунктов меню
  9.         IDM_MENU1 = 101
  10.         IDM_MENU2 = 102
  11.  
  12.         ; Добавить свои пункты меню
  13.         invoke  InsertMenu,ebx,3,MF_BYCOMMAND,IDM_MENU1,szMenu1
  14.         invoke  InsertMenu,ebx,4,MF_BYCOMMAND,IDM_MENU2,szMenu2
  15.         ...
  16.         ...
  17. szMenu1 db 'About',0
  18. szMenu2 db 'Exit',0
В этом примере используется функция InsertMenu, так как нам надо просто добавить пункты в меню. Если планируется использование дополнительных спецэффектов, то эту функцию можно заменить на более современную InsertMenuItem.

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

Как узнать состояние лотка CD-ROM

26.09.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
В комментариях к моей статье про управление лотком CD-ROM был задан правильный вопрос про то, как узнать состояние лотка CD-ROM, открыт он или закрыт. Обычно все программы, управляющие лотками CD-ROM, хранили эту информацию на основании своих последних действий. То есть, если программа открыла лоток привода, то в своем внутреннем массиве данных она ставит признак "открыто" и наоборот. Причем этот статус вполне мог не соответствовать реальному положению дел, если после этого лоток был закрыт или открыт вручную. Долгое время других способов определения статуса лотка CD-ROM не было. Но программист Александр (Rouse_) Багель в одной из своих разработок предложил хитрый способ определять реальное состояние лотка CD-ROM. Он заключается в том, чтобы отправить команду SCSIOP_MECHANISM_STATUS в запросе IOCTL_SCSI_PASS_THROUGH через функцию DeviceIoControl. Исходный пример был написан на Delphi, мне осталось его только перевести на Ассемблер.

Для начала определим все необходимые структуры и константы, которых по умолчанию нет в FASM.
  1. SCSI_IOCTL_DATA_IN      = 1
  2. SCSIOP_MECHANISM_STATUS = 0BDh
  3. IOCTL_SCSI_PASS_THROUGH = 4D004h
  4.  
  5. struct SCSI_PASS_THROUGH_DIRECT
  6.         Length             dw ?
  7.         ScsiStatus         db ?
  8.         PathId             db ?
  9.         TargetId           db ?
  10.         Lun                db ?
  11.         CdbLength          db ?
  12.         SenseInfoLength    db ?
  13.         DataIn             dd ?
  14.         DataTransferLength dd ?
  15.         TimeOutValue       dd ?
  16.         DataBuffer         dd ?
  17.         SenseInfoOffset    dd ?
  18.         Cdb                rb 16
  19. ends
  20.  
  21. struct SCSI_PASS_THROUGH_DIRECT_BUFFER
  22.         Header          SCSI_PASS_THROUGH_DIRECT
  23.         SenseBuffer     rb 20h
  24.         DataBuffer      rb 0C0h
  25. ends
Основные принципы работы с дисками через DeviceIoControl вы можете посмотреть по приведенной выше ссылке, здесь же я расскажу только о том, как определить статус лотка CD-ROM.

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

Перехват буфера обмена на Ассемблере

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

Перехват буфера обмена на Ассемблере

Сегодня разберем интересную тему - перехват буфера обмена. Применений этому перехвату можно найти много: менеджеры буфера обмена, хранящие последние несколько скопированных текстов; программы, выполняющие заданные действия, если в буфере обмена появилось кодовое слово; кейлоггеры, перехватывающие пароли и тексты пользователя; одно время были популярны трояны, подменяющие в буфере обмена номера электронных кошельков на свои собственные. Область применения любой технологии, как обычно, ограничивается только вашей фантазией. Но это все лирика, пора переходить к программированию.

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

Extreme Reboot & Shutdown 1.1

06.05.2013 | Категория: Мои программы | Автор: ManHunter

Скриншот программы Extreme Reboot & Shutdown

Комплект небольших программ, предназначенных для принудительного выключения и перезагрузки компьютера, гибернации и перевода системы в спящий режим. Программы extreme_off.exe и force_off.exe схожи по функционалу, разница только в используемых функциях. Мгновенно выключают компьютер без сохранения данных, никаких предупреждений не выдается. Программы extreme_reboot.exe и force_reboot.exe - программный аналог кнопки Reset. Никаких предупреждений не выдается, все процессы завершаются мгновенно и без сохранения данных, компьютер перезагружается. Используйте эти программы осторожно, не стоит злоупотреблять некорректным завершением работы системы! Программы safe_off.exe и safe_reboot.exe корректно завершают работу системы, а затем, соответственно, выключают или перезагружают компьютер. Аналог обычного "Пуск" - "Завершение работы". Программа hibernate.exe переводит систему в режим гибернации, а sleep.exe - в спящий режим. Все эти программы можно запускать из пакетных файлов или из заданий планировщиков.

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

Как узнать название шрифта в диалоговом окне приложения

14.03.2013 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для того, чтобы получить информацию о шрифте, используемом в окне или его отдельном элементе, можно применить следующий код.
  1.         ; Отправить окну запрос на получение информации о шрифте
  2.         invoke  SendMessage,[hWindow],WM_GETFONT,NULL,NULL
  3.         or      eax,eax
  4.         ; Данные о шрифте получить не удалось
  5.         jz      cant_get_font
  6.  
  7.         ; Получить объект с описанием шрифта
  8.         invoke  GetObject,eax,sizeof.LOGFONT,font
  9.         ; Теперь в font.lfFaceName строка названия шрифта
Сперва окну посылается сообщение WM_GETFONT, которое возвращает хэндл объекта-описателя шрифта. Если хэндл получить не удалось, то окно использует системный шрифт по умолчанию или не обрабатывает это сообщение. Но это еще не все. Чтобы получить подробное описание со всеми характеристиками шрифта, надо при помощи функции GetObject из полученного хэндла заполнить структуру LOGFONT. Один из параметров этой структуры lfFaceName - строка ASCIIZ с названием шрифта, максимальная длина которой 32 символа. Очень быстро и просто. У меня такой трюк используется в программе WinDowzer.

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

01 ... 21 22 23 24 25 26 27 ... 31
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.17 сек. / MySQL: 3 (0.0687 сек.) / Память: 5 Mb
Наверх