Образ мышления: Assembler
То, что не удается запрограммировать на Ассемблере, приходится паять
Образ мышления: Assembler - RSS-канал
Образ мышления: Assembler - Карта сайта
Как получить список физических дисков и узнать их размер
11.01.2018 | Категория: Образ мышления: Assembler | Автор: ManHunter
Как получить список физических дисков и узнать их размер
Как вы знаете, физические диски, установленные в системе, обозначаются символическими ссылками вида "\\.\PhysicalDrive0", "\\.\PhysicalDrive1" и так далее. Однако, в WinAPI нет простых штатных функций, чтобы получить их список. Для того, чтобы сделать это, в интернетах предлагают несколько различных способов. Например, самый дуболомный, это последовательный перебор всех значений от 0 до MAX_DRIVES. В разных компиляторах это значение может меняться от 16 до 26, также не исключено, что значение может дополнительно ограничиваться системой. Дальше в цикле формируется символическая ссылка с текущим индексом и с помощью вызова CreateFile осуществляется попытка открыть это устройство. Если функция вернула ERROR_FILE_NOT_FOUND, то такого физического диска в системе нет, если ошибки нет, то ссылка доступна для использования, в противном случае диск присутствует, но по какой-то причине у вас нет к нему доступа. В принципе, это решение имеет место на существование, но есть вариант более правильный.
Читать статью целиком »
Просмотров: 5328 | Комментариев: 9
Моргание окна на Ассемблере
12.12.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Наверняка вы не раз сталкивались с тем, что приложение, которое свернуто или работает в фоновом режиме, но хочет привлечь внимание пользователя, использует эффект моргания окна. Это может быть оповещение об окончании длительного процесса или просто информация для пользователя, с которой ему надо как можно быстрее ознакомиться. И действительно, такой способ работает. В этой статье я вам расскажу, как такой эффект реализуется.Самый простой способ моргнуть окном - использовать стандартную функцию FlashWindow. Для ее использования нужно только знать хэндл окна, которое должно моргнуть, вот и все. Это не обязательно должно быть окно именно вашего приложения, вы можете легко моргать любым окном, доступным в системе. Вызов простейший:
Code (Assembler) : Убрать нумерацию
- ; hwnd - хэндл окна, которое должно моргнуть
- invoke FlashWindow,[hwnd],FALSE
Если требуется иметь полный контроль над параметрами моргания, то надо использовать более продвинутую функцию FlashWindowEx. Но сперва придется самостоятельно описать используемые структуры и константы, так как FASM в стандартной комплектации их не знает.
Code (Assembler) : Убрать нумерацию
- ; Описание структуры для моргания окна
- struct FLASHWINFO
- cbSize dd ?
- hwnd dd ?
- dwFlags dd ?
- uCount dd ?
- dwTimeout dd ?
- ends
- ; Флаги режимов моргания окна
- FLASHW_CAPTION = 0x00000001
- FLASHW_TRAY = 0x00000002
- FLASHW_ALL = 0x00000003
- flash FLASHWINFO ; Структура для моргания окна
Code (Assembler) : Убрать нумерацию
- ; Заполнить структуру FLASHWINFO
- mov [flash.cbSize],sizeof.FLASHWINFO
- ; Хэндл окна, которое должно моргнуть
- mov ecx,[hwnd]
- mov [flash.hwnd],ecx
- ; Режим моргания - заголовок и кнопка окна в панели задач
- mov [flash.dwFlags],FLASHW_ALL
- ; Количество морганий, в моем примере 10 итераций
- mov [flash.uCount],10
- ; Частота морганий
- mov [flash.dwTimeout],80
- ; Вызвать функцию
- invoke FlashWindowEx,flash
Читать статью целиком »
Просмотров: 1519 | Комментариев: 0
Работа с иконками файлов на Ассемблере
23.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Работа с иконками файлов на Ассемблере
Я уже рассказывал, как можно получить иконку из окна чужого приложения, сегодня тема будет похожей. Разница в том, что иконку мы будем получать из файла на диске. Применений для этого может быть много, например, чтобы отрисовать в вашем приложении красивый список файлов, нарисовать всплывающее меню, заменить иконку в собранном джойнере или патче. Для работы с иконками в WInAPI есть несколько функций, каждая со своими особенностями. В этой статье я попытаюсь подробно рассказать о них.
Читать статью целиком »
Просмотров: 2226 | Комментариев: 2
Меню с иконками на Ассемблере
07.11.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодня разберем кастомизацию такого элемента интерфейса, как выпадающее меню. Без меню обходится мало какое современное приложение, но вот работа с меню стандартными средствами обычно ограничивается установкой флага чекбокса, затенением неактивных пунктов или отрисовкой субменю. Попытка разнообразить меню, например, своими иконками, приводит к очень печальному результату. Ситуацию особо не спасают ни собственные битмапы, ни подгрузка изображений из списка ImageList. Очень странно, что на протяжении многих лет разработчики Windows так и не сделали инструментов "из коробки", чтобы можно было легко и комфортно работать с менюшками. К счастью, в системе есть "потайной ход", с помощью которого можно кастомизировать меню так, как вам захочется. Для своих проектов я постарался сделать как можно более универсальный инструмент для работы с меню и сейчас я с вами им поделюсь.Начнем создание собственных элементов интерфейса с того, что для каждого настраиваемого меню резервируется структура с данными следующего формата:
Code (Assembler) : Убрать нумерацию
- struct MYMENU
- hMenu dd ?
- itemWidth dd ?
- itemHeight dd ?
- hasIcons db ?
- ends
Code (Assembler) : Убрать нумерацию
- menus dd Menu1
- dd Menu2
- dd ?
- Menu1 MYMENU
- Menu2 MYMENU
Читать статью целиком »
Просмотров: 3057 | Комментариев: 3
Ассемблер: получаем имя файла оболочки
27.09.2017 | Категория: Образ мышления: Assembler | Автор: ManHunter
В этой статье я расскажу, как можно программно получить имя файла оболочки Windows. Зачем это нужно? Например, есть программа, которая инжектит свою библиотеку в работающую копию explorer.exe и при этом подразумевает, что такой процесс в системе гарантированно должен присутствовать. В подавляющем большинстве случаев действительно все работает, никаких нареканий нет. Но стоит запустить программу под альтернативным шеллом, например, Aston Desktop, и она неизбежно падает с ошибкой, потому что explorer.exe в системе вообще не запущен. Проверки на соответствие оболочки в программе нет, и вместо корректного информирования пользователя о причинах невозможности запуска мы получаем фатальное падение. И хорошо, если не вместе с системой.Чтобы найти процесс оболочки, сперва надо определить ее главное окно. В MSDN для этого рекомендуют воспользоваться следующим кодом:
Code (Assembler) : Убрать нумерацию
- ; Найти окно с классом "Progman"
- invoke FindWindow, szClass, NULL
- ...
- szClass db 'Progman',0
Читать статью целиком »
Просмотров: 2351 | Комментариев: 3