Blog. Just Blog

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

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

Отслеживание изменения метки тома

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

Сперва небольшое количество данных для работы, которые отсутствуют в инклудах FASM.
  1. struct SHChangeNotifyEntry
  2.         pidl       dd ?
  3.         fRecursive dd ?
  4. ends
  5.  
  6. SHCNRF_ShellLevel  = 0x0002
  7. SFGAO_FILESYSTEM   = 0x40000000
  8. SHCNE_RENAMEFOLDER = 0x00020000
Первым делом преобразуем имя отслеживаемого файла, диска или каталога в объект, для этого вызовем функцию SHParseDisplayName. После этого надо заполнить массив отслеживаемых объектов. У нас только один объект - диск C:\, но можно добавить любое их количество.
  1.         ; Настроить отслеживаемый объект
  2.         invoke  SHParseDisplayName,szWatch,NULL,\
  3.                 pidl,SFGAO_FILESYSTEM,NULL
  4.  
  5.         ; Заполнить массив отслеживаемых объектов
  6.         mov     eax,[pidl]
  7.         mov     [shentry.pidl],eax
  8.         mov     [shentry.fRecursive],FALSE
  9.  
  10.         ; Зарегистрировать обработчик уведомлений
  11.         invoke  SHChangeNotifyRegister,\
  12.                 [hwnddlg],\
  13.                 SHCNRF_ShellLevel,\
  14.                 SHCNE_RENAMEFOLDER,\
  15.                 WM_LABEL_CHANGED,\
  16.                 1,\
  17.                 shentry
  18.         mov     [cookie],eax
  19.  
  20.         ; Освободить неиспользуемую память
  21.         invoke  CoTaskMemFree,[pidl]
Так как мы отслеживаем изменение метки тома, а метка тома по сути является разновидностью каталога, то нам достаточно типа уведомления SHCNE_RENAMEFOLDER. Но никто не мешает скомбинировать типы уведомлений для отслеживания или вообще подписаться на все подряд, указав флаг SHCNE_ALLEVENTS.

Код WM_LABEL_CHANGED - это пользовательское сообщение окну приложения, его можно описать, например, как WM_LABEL_CHANGED = WM_USER + 200. При поступлении уведомления от системы именно это сообщение будет отправлено целевому окну обработчика. В параметре lParam находится код события, что очень полезно, когда приложение подписано сразу на несколько событий.

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

Проверка цифровой подписи исполняемого файла

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

Проверка цифровой подписи исполняемого файла

Цифровая подпись в настоящее время является одним из основных способов подтверждения, что файл не был модифицирован, что он получен от достоверного источника и что он принадлежит именно тому издателю, который заявлен. Использование современных криптографических алгоритмов практически исключают возможность ее подделки. А вот как программно проверить цифровую подпись исполняемых файлов - это я вам сейчас расскажу.

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

Запись числа римскими цифрами на Ассемблере

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

Запись числа римскими цифрами на Ассемблере

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

Натуральные числа записываются при помощи повторения этих цифр. При этом применяется следующее базовое правило: одна и та же букво-цифра не может повторяться в записи числа более 3-х раз подряд. Для этого введены дополнительные двухбуквенные комбинации и, если меньшая букво-цифра стоит перед большей, то меньшая вычитается из большей. В табличке это наглядно видно. Но ограниченный набор букво-цифр приводит к тому, что максимальное число, которое можно записать базовым набором римских цифр, не может превышать десятичного числа 3999 (MMMCMXCIX). Также в римской записи нет нулевого значения, отрицательных и дробных чисел.

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

Анимация окон с помощью функции AnimateWindow

16.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Когда-то давно я показывал, как можно реализовать анимацию окна вручную. Сейчас покажу, как подобная анимация делается штатными функциями Windows, а точнее одной единственной функцией AnimateWindow. Но сперва некоторое количество констант, которые используются в программе, но про которые не знает FASM.
  1. AW_HOR_POSITIVE = 0x00000001
  2. AW_HOR_NEGATIVE = 0x00000002
  3. AW_VER_POSITIVE = 0x00000004
  4. AW_VER_NEGATIVE = 0x00000008
  5. AW_CENTER       = 0x00000010
  6. AW_HIDE         = 0x00010000
  7. AW_ACTIVATE     = 0x00020000
  8. AW_SLIDE        = 0x00040000
  9. AW_BLEND        = 0x00080000
Первым параметром функции указывается продолжительность эффекта анимации, вторым - флаг или комбинация флагов, описывающих этот эффект. Флаги AW_HOR_POSITIVE, AW_HOR_NEGATIVE, AW_VER_POSITIVE и AW_VER_NEGATIVE отвечают, соответственно, за горизонтальное и вертикальное разворачивание окна. Если скомбинировать флаг одного из горизонтальных направлений с флагом одного из вертикальных направлений, то окно будет раскрываться по диагонали. А если к одному из этих флагов добавить AW_SLIDE, то окно будет как бы выезжать из указанного направления. AW_BLEND отвечает за эффект прозрачности, что-то подобное я также реализовал вручную, только тут не надо возиться с WS_EX_LAYERED и SetLayeredWindowAttributes, всю грязную работу система берет на себя. При использовании флага AW_CENTER окно будет разворачиваться из своей центральной точки. Для того, чтобы эффект применялся не для открытия, а для сворачивания окна, к эффектам надо добавлять флаг AW_HIDE. На практике это выглядит примерно так, вот фрагмент функции обработчика диалогового окна:
  1.         cmp     [msg],WM_INITDIALOG
  2.         je      wminitdialog
  3.         cmp     [msg],WM_CLOSE
  4.         je      wmclose
  5.         ...
  6.  
  7. wminitdialog:
  8.         ; Плавно развернуть окно из центра
  9.         invoke  AnimateWindow,[hwnddlg],300,AW_CENTER+AW_ACTIVATE
  10.         ...
  11. wmclose:
  12.         ; Плавно потушить окно при закрытии
  13.         invoke  AnimateWindow,[hwnddlg],300,AW_BLEND+AW_HIDE
  14.         ...
Не обошлось и без особенностей. Обычные окна с заголовком при применении к ним функции AnimateWindow дают необычный эффект: появляется или исчезает только их внутреннее содержимое, а рамка остается неизменной. Поэтому функцию желательно применять к беззаголовочным окнам типа сплэш-окон, окнам всплывающих уведомлений, всяким патчам-кейгенам и тому подобным.

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

Создание комбинированных иконок

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

Создание комбинированных иконок

Комбинирование иконок применяется в Windows очень часто. Самый яркий пример - маленькая иконка со стрелочкой поверх основной иконки приложения на ярлыках. Или иконки расшаренных дисков и каталогов. В приложениях такой трюк тоже можно использовать, когда интерфейс предполагает большое количество кнопок или графических STATIC'ов с разными состояниями. Вместо того, чтобы таскать в ресурсах кучу иконок под каждое состояние каждого элемента интерфейса, достаточно хранить базовый набор иконок и маленькие иконки-оверлеи, а затем их динамически комбинировать.

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

01 ... 05 06 07 08 09 10 11 ... 73
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 3 (0.0137 сек.) / Память: 4.5 Mb
Наверх