Blog. Just Blog

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

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

Drag'n'Drop файлов в консольное окно

06.12.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Очередная порция странного. На этот раз я решил попробовать реализовать обработку перетаскивания файлов в консольное окно. Для обычных GUI-приложений с этим нет вообще никаких сложностей, а вот с консольными приложениями придется повозиться. Вопреки тиражируемым в этих ваших интернетах статьям, с консольными окнами не работают никакие стандартные способы перетаскивания данных типа манипулирования с расширенными стилями консольного окна WS_EX_ACCEPTFILES, с принудительным назначением ему DragAcceptFiles, с субклассированием на предмет обработки сообщения WM_DROPFILES или даже через реализацию интерфейса IDropTarget. Ни-че-го. В тоже время, если открыть системный командный интерпретатор cmd.exe и попытаться перетащить на его консольное окно какой-нибудь файл из Проводника или файлового менеджера, то в командной строке появится полный путь к этому файлу. Значит какие-то зачатки технологии Drag'n'Drop для консольных окон все-таки имеются.

С помощью обработки событий консоли удалось выяснить, что при перетаскивании файла в консольное окно, путь к нему передается посимвольно через события KEY_EVENT. При более детальном анализе я также выяснил, что четкой системы тут нет, часть символов передается с событием нажатия и отпускания клавиши, а часть только с отпусканием клавиш. Единственные закономерности заключаются в том, что такие символы передаются обязательно со счетчиком повторений равным 1 и точно с флагом отпускания клавиш.

Также не стоит забывать про различные программы-обработчики клавиатуры типа Punto Switcher, которые самостоятельно обрабатывают введенные символы и затем могут менять их раскладку и последовательность через эмуляцию ввода с клавиатуры.

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

Получение информации о шрифте с помощью функции GetFontResourceInfo

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

Получение информации о шрифте с помощью функции GetFontResourceInfo

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

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

Парсинг метаданных DSF-файлов на Ассемблере

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

Парсинг метаданных DSF-файлов на Ассемблере

Во время очередного пиратского набега на торренты мне попался музыкальный альбом в формате DSF. Это контейнер для аудиопотока в супер-мега качестве, разработанный компаниями Sony и Philips. В результате и файлы получаются по 400-500 мегабайт на одну песню. Может быть для аудиофилов такое качество как-то можно обосновать, но для меня этот формат представляет исключительно спортивный интерес. А точнее, как из таких файлов извлечь метаданные.

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

Как защитить DLL от выгрузки через FreeLibrary

07.11.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Небольшой трюк, позволяющий защитить вашу DLL от выгрузки из процесса при помощи функции FreeLibrary. Например, если процесс обнаружил инжект посторонней библиотеки в свое адресное пространство и пытается от нее избавиться.

Сперва немного теории. При вызове функции LoadLibrary увеличивается на единицу внутренний счетчик загрузок, но повторной загрузки библиотеки не выполняется. При вызове функции FreeLibrary, соответственно, этот счетчик уменьшается. При достижении счетчиком нулевого значения библиотека выгружается из памяти. На этом основан метод "защиты" от выгрузки, когда в самой DLL несколько раз дополнительно вызывается LoadLibrary, тем самым увеличивая счетчик загрузок. Но ведь никто не мешает вызвать FreeLibrary сто или сто тысяч раз подряд, пока счетчик не будет обнулен. Поэтому я взял слово "защита" в кавычки.

Правильным способом защититься от выгрузки DLL из целевого процесса будет использование функции GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_PIN. Функция должна вызываться из DLL. В этом случае загруженный модуль будет оставаться в памяти вплоть до завершения основного процесса, независимо от того, сколько раз будет вызвана функция FreeLibrary.

Просмотров: 447 | Комментариев: 2

Как получить список поддерживаемых кодировок

05.11.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Сегодняшний небольшой пример кода - получение списка всех поддерживаемых кодировок в системе. Примерно такой список можно увидеть в меню сохранения в текстовых редакторах или в браузерах, когда надо выбрать кодировку страницы. Если ваше приложение умеет работать с разными кодировками, то значит должно уметь и получать их список.

Начинаем с констант и структуры, которые отсутствуют в FASM.
  1. CP_SUPPORTED = 0x00000002
  2.  
  3. MAX_LEADBYTES   = 12
  4. MAX_DEFAULTCHAR = 2
  5.  
  6. struct CPINFOEX
  7.         MaxCharSize        dd ?
  8.         DefaultChar        rb MAX_DEFAULTCHAR
  9.         LeadByte           rb MAX_LEADBYTES
  10.         UnicodeDefaultChar dw ?
  11.         CodePage           dd ?
  12.         CodePageName       rb MAX_PATH
  13. ends
Для получения списка всех доступных кодировок надо вызвать функцию EnumSystemCodePages с параметром CP_SUPPORTED или с параметром CP_INSTALLED, если надо узнать только список установленных.
  1.         ; Получить список поддерживаемых кодировок
  2.         invoke  EnumSystemCodePages,CodePageEnumProc,CP_SUPPORTED
Другим параметром передается адрес функции обработчика, которой будут поочередно передаваться идентификаторы кодировок.

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

prev 01 ... 06 07 08 09 10 11 12 ... 74 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2025
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.003 сек.) / Память: 4.5 Mb
Наверх