Blog. Just Blog

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

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

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

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", а при отсутствии запущенного штатного шелла это гарантированно приведет к неверным результатам.

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

Работа с Desktop Window Manager на Ассемблере

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

Работа с Desktop Window Manager на Ассемблере

Начиная с Windows Vista, в составе системы появился Desktop Window Manager, он же Диспетчер рабочего стола. Этот компонент обеспечивает визуальные эффекты и возможности интерфейса Windows Aero, например, такие как полупрозрачные заголовки окон, Aero Peek, Flip3D и живые миниатюры окон на таскбаре при наведении на него мышкой. Для взаимодействия с Desktop Window Manager разработчикам программ предоставляется целый набор функций API, с некоторыми из этих функций мы сегодня научимся работать.

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

Красивый градиентный ProgressBar на Ассемблере

25.07.2016 | Категория: Образ мышления: Assembler | Автор: ManHunter
Элемент ProgressBar, он же индикатор прогресса, используется в тех случаях, когда нужно показать пользователю степень завершения какого-либо действия. Есть стандартный элемент msctls_progress32, но он практически не поддается настройке в плане дизайна. Например, его нельзя сделать градиентным, чтобы заливка плавно перетекала от зеленого, через желтый и до красного. Но можно нарисовать красивую полосу ProgressBar самостоятельно. Идею я позаимствовал у kero, знаю, что он сюда иногда заглядывает и надеюсь, что он будет не против. Оригинал написан на MASM, я доработал его и портировал на FASM.


Принцип создания градиентного ProgressBar

Принцип создания градиентного прогрессбара заключается в том, что на элемент STATIC на всю его площадь накладывается готовое изображение. Затем создается дополнительное непрозрачное окно, являющееся дочерним к STATIC и расположенное поверх него. Регулируя размер и положение этого дочернего окна, открывается та или иная площадь изображения, пропорционально нужному проценту заполнения. Это чем-то напоминает создание рейтингов на CSS. Еще одна хитрость заключается в том, что изображение прогрессбара загружается из ресурсов функцией LoadImage, которая позволяет сразу указывать нужные размеры. Если исходное изображение меньше, то оно автоматически растягивается. Таким образом, для создания цветного прогрессбара достаточно однопиксельного изображения, а из крохотного bitmap'а шириной всего в три пиксела получается красивый градиентный прогрессбар любого размера.

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

Программы для работы с окнами приложений

01.07.2016 | Категория: Темная сторона Силы | Автор: ManHunter

Программы для работы с окнами приложений

В процессе разработки программ, а также их исследования, очень часто приходится работать с окнами приложений на уровне системы. То есть просматривать или менять стили окон, передавать или отслеживать сообщения и уведомления, обрабатывать другие параметры окон. У меня накопилась небольшая подборка программ, значительно облегчающих выполнение таких задач, и сегодня я подготовил обзор своего инструментария.

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

Как на Ассемблере сделать скриншот отдельного окна

02.11.2015 | Категория: Образ мышления: Assembler | Автор: ManHunter
Одна из интересных задач при работе с окнами - захват и сохранение скриншота выбранного окна или всего экрана целиком. Во многих руководствах по программированию для этого рекомендуют использовать функцию BitBlt.
  1.         ; Захват отдельного окна через BitBlt
  2.         invoke  GetWindowDC,[hWnd]
  3.         mov     [windowDC],eax
  4.  
  5.         invoke  CreateCompatibleDC,[windowDC]
  6.         mov     [newDC],eax
  7.  
  8.         ; Создать пустой битмап для скриншота
  9.         invoke  CreateCompatibleBitmap,[windowDC],[window_width],[window_height]
  10.         mov     [hBitmap],eax
  11.  
  12.         invoke  SelectObject,[newDC],[hBitmap]
  13.  
  14.         ; Флаг для захвата полупрозрачных окон
  15.         CAPTUREBLT = 0x40000000
  16.         invoke  BitBlt,[newDC],0,0,[window_width],[window_height],[windowDC],\
  17.                 0,0,SRCCOPY+CAPTUREBLT
  18.         ; Теперь в [hBitmap] находится изображение (Bitmap) окна
Флаг CAPTUREBLT обеспечивает захват полупрозрачных окон с альфа-каналом. Способ реально рабочий, очень простой в реализации, но у него есть один огромный недостаток. Если окно, с которого требуется сделать снимок, перекрыто другими окнами или частично находится за пределами экрана, то оно так и будет сохранено с перекрывающими кусками чужих окон, а отсутствующая на экране область и вовсе будет заменена черным пятном.

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

prev 01 02 03 04 05 06 07 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2017
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.11 сек. / MySQL: 3 (0.0321 сек.) / Память: 4.5 Mb
Наверх