Blog. Just Blog

Образ мышления: Assembler

То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал Образ мышления: Assembler - Карта сайта

Как получить список физических дисков и узнать их размер

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

Как получить список физических дисков и узнать их размер

Как вы знаете, физические диски, установленные в системе, обозначаются символическими ссылками вида "\\.\PhysicalDrive0", "\\.\PhysicalDrive1" и так далее. Однако, в WinAPI нет простых штатных функций, чтобы получить их список. Для того, чтобы сделать это, в интернетах предлагают несколько различных способов. Например, самый дуболомный, это последовательный перебор всех значений от 0 до MAX_DRIVES. В разных компиляторах это значение может меняться от 16 до 26, также не исключено, что значение может дополнительно ограничиваться системой. Дальше в цикле формируется символическая ссылка с текущим индексом и с помощью вызова CreateFile осуществляется попытка открыть это устройство. Если функция вернула ERROR_FILE_NOT_FOUND, то такого физического диска в системе нет, если ошибки нет, то ссылка доступна для использования, в противном случае диск присутствует, но по какой-то причине у вас нет к нему доступа. В принципе, это решение имеет место на существование, но есть вариант более правильный.

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

Моргание окна на Ассемблере

12.12.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наверняка вы не раз сталкивались с тем, что приложение, которое свернуто или работает в фоновом режиме, но хочет привлечь внимание пользователя, использует эффект моргания окна. Это может быть оповещение об окончании длительного процесса или просто информация для пользователя, с которой ему надо как можно быстрее ознакомиться. И действительно, такой способ работает. В этой статье я вам расскажу, как такой эффект реализуется.

Самый простой способ моргнуть окном - использовать стандартную функцию FlashWindow. Для ее использования нужно только знать хэндл окна, которое должно моргнуть, вот и все. Это не обязательно должно быть окно именно вашего приложения, вы можете легко моргать любым окном, доступным в системе. Вызов простейший:
  1.         ; hwnd - хэндл окна, которое должно моргнуть
  2.         invoke  FlashWindow,[hwnd],FALSE
В качестве бонуса она возвращает статус окна, к которому была применена: нулевое значение, если окно не было активным, и ненулевое значение, если было. Это полезно, например, в том случае, когда надо продолжать привлекать внимание пользователя до тех пор, пока он не активирует нужное окно. Недостаток функции FlashWindow в том, что параметры моргания зависят от системы, мы со своей стороны никак на них повлиять не можем.

Если требуется иметь полный контроль над параметрами моргания, то надо использовать более продвинутую функцию FlashWindowEx. Но сперва придется самостоятельно описать используемые структуры и константы, так как FASM в стандартной комплектации их не знает.
  1. ; Описание структуры для моргания окна
  2. struct FLASHWINFO
  3.   cbSize    dd ?
  4.   hwnd      dd ?
  5.   dwFlags   dd ?
  6.   uCount    dd ?
  7.   dwTimeout dd ?
  8. ends
  9.  
  10. ; Флаги режимов моргания окна
  11. FLASHW_CAPTION = 0x00000001
  12. FLASHW_TRAY    = 0x00000002
  13. FLASHW_ALL     = 0x00000003
  14.  
  15. flash       FLASHWINFO ; Структура для моргания окна
Перед вызовом функции в структуре FLASHWINFO заполняются все необходимые параметры: хэндл окна, режим моргания (только заголовок окна, только кнопка окна на панели задач или все сразу), количество морганий и частота.
  1.         ; Заполнить структуру FLASHWINFO
  2.         mov     [flash.cbSize],sizeof.FLASHWINFO
  3.         ; Хэндл окна, которое должно моргнуть
  4.         mov     ecx,[hwnd]
  5.         mov     [flash.hwnd],ecx
  6.         ; Режим моргания - заголовок и кнопка окна в панели задач
  7.         mov     [flash.dwFlags],FLASHW_ALL
  8.         ; Количество морганий, в моем примере 10 итераций
  9.         mov     [flash.uCount],10
  10.         ; Частота морганий
  11.         mov     [flash.dwTimeout],80
  12.         ; Вызвать функцию 
  13.         invoke  FlashWindowEx,flash
Возвращаемое значение такое же, как и в случае с FlashWindow. Во время работы функций FlashWindow и FlashWindowEx все повторные вызовы моргания будут игнорироваться.

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

Работа с иконками файлов на Ассемблере

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

Работа с иконками файлов на Ассемблере

Я уже рассказывал, как можно получить иконку из окна чужого приложения, сегодня тема будет похожей. Разница в том, что иконку мы будем получать из файла на диске. Применений для этого может быть много, например, чтобы отрисовать в вашем приложении красивый список файлов, нарисовать всплывающее меню, заменить иконку в собранном джойнере или патче. Для работы с иконками в WInAPI есть несколько функций, каждая со своими особенностями. В этой статье я попытаюсь подробно рассказать о них.

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

Меню с иконками на Ассемблере

07.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем кастомизацию такого элемента интерфейса, как выпадающее меню. Без меню обходится мало какое современное приложение, но вот работа с меню стандартными средствами обычно ограничивается установкой флага чекбокса, затенением неактивных пунктов или отрисовкой субменю. Попытка разнообразить меню, например, своими иконками, приводит к очень печальному результату. Ситуацию особо не спасают ни собственные битмапы, ни подгрузка изображений из списка ImageList. Очень странно, что на протяжении многих лет разработчики Windows так и не сделали инструментов "из коробки", чтобы можно было легко и комфортно работать с менюшками. К счастью, в системе есть "потайной ход", с помощью которого можно кастомизировать меню так, как вам захочется. Для своих проектов я постарался сделать как можно более универсальный инструмент для работы с меню и сейчас я с вами им поделюсь.

Начнем создание собственных элементов интерфейса с того, что для каждого настраиваемого меню резервируется структура с данными следующего формата:
  1. struct MYMENU
  2.   hMenu      dd ?
  3.   itemWidth  dd ?
  4.   itemHeight dd ?
  5.   hasIcons   db ?
  6. ends
В это же время, все меню, которые требуют кастомизации, формируют массив структур и указателей на них. Список заканчивается нулевым DWORD'ом:
  1. menus   dd Menu1
  2.         dd Menu2
  3.         dd ?
  4.  
  5. Menu1   MYMENU
  6. Menu2   MYMENU
Описание полей структуры: hMenu - хэндл меню, itemWidth - ширина пункта меню в пикселах, itemHeight - высота пункта меню в пикселах, hasIcons - флаг, определяющий, будут или нет использоваться в меню иконки (1 - да, 0 - нет). Если иконки будут использоваться, то слева от текста пунктов меню резервируется место для них, в противном случае текст пункта будет отрисовываться прямо от края меню.

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

Ассемблер: получаем имя файла оболочки

27.09.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
В этой статье я расскажу, как можно программно получить имя файла оболочки Windows. Зачем это нужно? Например, есть программа, которая инжектит свою библиотеку в работающую копию explorer.exe и при этом подразумевает, что такой процесс в системе гарантированно должен присутствовать. В подавляющем большинстве случаев действительно все работает, никаких нареканий нет. Но стоит запустить программу под альтернативным шеллом, например, Aston Desktop, и она неизбежно падает с ошибкой, потому что explorer.exe в системе вообще не запущен. Проверки на соответствие оболочки в программе нет, и вместо корректного информирования пользователя о причинах невозможности запуска мы получаем фатальное падение. И хорошо, если не вместе с системой.

Чтобы найти процесс оболочки, сперва надо определить ее главное окно. В MSDN для этого рекомендуют воспользоваться следующим кодом:
  1.         ; Найти окно с классом "Progman"
  2.         invoke  FindWindow, szClass, NULL
  3.         ...
  4. szClass db 'Progman',0
Недостатки такого способа, надеюсь, очевидны. Ничто не мешает любому приложению создать окно с классом "Progman", а при отсутствии запущенного штатного шелла это гарантированно приведет к неверным результатам.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2019
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0018 сек.) / Память: 5 Mb
Наверх