Отслеживание изменения метки тома
27.09.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько лет назад я демонстрировал, как можно легко и просто отслеживать изменения в каком-нибудь каталоге. Кроме отслеживания подобных глобальных движений, система позволяет отслеживать изменения более точечно, например, на отдельных объектах файловой системы. Для этого есть функция SHChangeNotifyRegister. В качестве примера я разберу, как можно отслеживать изменение метки тома. На самом деле функция SHChangeNotifyRegister обладает гораздо более широкими возможностями по отслеживанию различных системных уведомлений.Сперва небольшое количество данных для работы, которые отсутствуют в инклудах FASM.
Code (Assembler) : Убрать нумерацию
- struct SHChangeNotifyEntry
- pidl dd ?
- fRecursive dd ?
- ends
- SHCNRF_ShellLevel = 0x0002
- SFGAO_FILESYSTEM = 0x40000000
- SHCNE_RENAMEFOLDER = 0x00020000
Code (Assembler) : Убрать нумерацию
- ; Настроить отслеживаемый объект
- invoke SHParseDisplayName,szWatch,NULL,\
- pidl,SFGAO_FILESYSTEM,NULL
- ; Заполнить массив отслеживаемых объектов
- mov eax,[pidl]
- mov [shentry.pidl],eax
- mov [shentry.fRecursive],FALSE
- ; Зарегистрировать обработчик уведомлений
- invoke SHChangeNotifyRegister,\
- [hwnddlg],\
- SHCNRF_ShellLevel,\
- SHCNE_RENAMEFOLDER,\
- WM_LABEL_CHANGED,\
- 1,\
- shentry
- mov [cookie],eax
- ; Освободить неиспользуемую память
- invoke CoTaskMemFree,[pidl]
Код WM_LABEL_CHANGED - это пользовательское сообщение окну приложения, его можно описать, например, как WM_LABEL_CHANGED = WM_USER + 200. При поступлении уведомления от системы именно это сообщение будет отправлено целевому окну обработчика. В параметре lParam находится код события, что очень полезно, когда приложение подписано сразу на несколько событий.
Читать статью целиком »
Просмотров: 429 | Комментариев: 0