Blog. Just Blog

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

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

GUID Helper 1.7

22.07.2023 | Категория: Мои программы | Автор: ManHunter

Скриншот программы GUID Helper

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

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

Пользовательская фильтрация в функции SHBrowseForFolder

16.07.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Функцию SHBrowseForFolder я оттюнинговал уже давно, казалось бы уже все, дальше некуда. Ан нет, есть куда. Сегодня разберем еще одну замечательную возможность этой функции, а именно пользовательскую фильтрацию. С ее помощью вы можете выводить в древовидный список только те папки и файлы, которые считаете нужным. Это будет очень полезно, когда надо дополнительно подстраховать пользователя от возможной ошибки.

Для реализации фильтрации используется технология COM, а это значит, что нам потребуется некоторое количество GUID'ов, структур и констант, которые не знает FASM.
  1. ; GUID {00000000-0000-0000-C000-000000000046}
  2. IID_IUnknown \
  3.     dd 000000000h
  4.     dw 00000h
  5.     dw 00000h
  6.     db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
  7.  
  8. ; GUID {C0A651F5-B48B-11D2-B5ED-006097C686F6}
  9. IID_IFolderFilterSite \
  10.     dd 0C0A651F5h
  11.     dw 0B48Bh
  12.     dw 011D2h
  13.     db 0B5h, 0EDh, 000h, 060h, 097h, 0C6h, 086h, 0F6h
  14.  
  15. ; IID_IFolderFilterSite Interface
  16. struct IFolderFilterSite
  17.     ; IUnknown
  18.     QueryInterface dd ?   ; 000h
  19.     AddRef         dd ?   ; 004h
  20.     Release        dd ?   ; 008h
  21.     ; IFolderFilterSite
  22.     SetFilter      dd ?   ; 00Ch
  23. ends
  24.  
  25. ; GUID {9CC22886-DC8E-11D2-B1D0-00C04F8EEB3E}
  26. IID_IFolderFilter \
  27.     dd 09CC22886h
  28.     dw 0DC8Eh
  29.     dw 011D2h
  30.     db 0B1h, 0D0h, 000h, 0C0h, 04Fh, 08Eh, 0EBh, 03Eh
  31.  
  32. ; IID_IFolderFilter Interface
  33. struct IFolderFilter
  34.     ; IUnknown
  35.     QueryInterface dd ?   ; 000h
  36.     AddRef         dd ?   ; 004h
  37.     Release        dd ?   ; 008h
  38.     ; IFolderFilter
  39.     ShouldShow     dd ?   ; 00Ch
  40.     GetEnumFlags   dd ?   ; 010h
  41.     refcount       dd ?
  42. ends
  43.  
  44. ; IID_IShellFolder Interface
  45. struct IShellFolder
  46.     ; IUnknown
  47.     QueryInterface   dd ?   ; 000h
  48.     AddRef           dd ?   ; 004h
  49.     Release          dd ?   ; 008h
  50.     ; IShellFolder
  51.     ParseDisplayName dd ?   ; 00Ch
  52.     EnumObjects      dd ?   ; 010h
  53.     BindToObject     dd ?   ; 014h
  54.     BindToStorage    dd ?   ; 018h
  55.     CompareIDs       dd ?   ; 01Ch
  56.     CreateViewObject dd ?   ; 020h
  57.     GetAttributesOf  dd ?   ; 024h
  58.     GetUIObjectOf    dd ?   ; 028h
  59.     GetDisplayNameOf dd ?   ; 02Ch
  60.     SetNameOf        dd ?   ; 030h
  61. ends
  62.  
  63. struct STRRET
  64.     uType dd ?
  65.     cStr  rb 260
  66. ends
  67.  
  68. SHCONTF_FOLDERS    = 0x00000020
  69. SHCONTF_NONFOLDERS = 0x00000040
  70.  
  71. SFGAO_FOLDER = 0x20000000
  72.  
  73. SHGDN_FORPARSING = 0x8000
  74.  
  75. BFFM_IUNKNOWN = 5
  76.  
  77. ; Флаги открытия диалога
  78. BIF_RETURNONLYFSDIRS   = 1
  79. BIF_DONTGOBELOWDOMAIN  = 2
  80. BIF_BROWSEINCLUDEFILES = 0x00004000
  81. BIF_NEWDIALOGSTYLE     = 0x00000040
Теперь немного теории. В callback-функцию BrowseCallbackProc диалога выбора помимо прочих сообщений приходит сообщение BFFM_IUNKNOWN, в параметре lParam которого системой передается указатель на интерфейс IUnknown. Через метод QueryInterface этого интерфейса можно получить указатель на интерфейс IFolderFilterSite. Затем с помощью метода SetFilter этого интерфейса нужно установить пользовательский фильтр. Фильтр представляет собой объект IFolderFilter, реализация методов которого ложится целиком и полностью на разработчика приложения. Благо их совсем немного.

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

Распаковка ZIP-архивов на Ассемблере

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

Распаковка ZIP-архивов на Ассемблере

Если система выполняет какие-то действия "из коробки", то с очень большой вероятностью ваше приложение также сможет их использовать, надо только узнать как. Начиная с Windows XP, Проводник может работать с архивами в формате ZIP, как будто это обычные каталоги. Файлы и подкаталоги из них извлекаются обычным копированием. Давайте научимся делать то же самое.

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

Обработка событий IWebBrowser на Ассемблере

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

Обработка событий IWebBrowser на Ассемблере

В предыдущей статье про работу со встроенным браузером я написал, что статус полной загрузки страницы можно отслеживать при помощи таймера и вызова метода get_ReadyState интерфейса IWebBrowser2. Способ имеет место быть, но также имеет немало недостатков. Правильное решение этой задачи - получения сигналов от объекта браузера и обработка событий IWebBrowser. Пришлось провести пару бессонных ночей в отладчике, но результат меня порадовал.

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

Работа с Zone.Identifier на Ассемблере

12.05.2023 | Категория: Образ мышления: Assembler | Автор: ManHunter
Несколько лет назад я выкладывал пару статей на тему блокировки файлов с помощью альтернативных файловых потоков и Zone.Identifier. Там вся работа с ними выполнялась или средствами самой системы Windows, или сторонними приложениями. Настало время написать собственное приложение.

Сперва немного теории. За блокировку файлов отвечает COM-объект IZoneIdentifier для работы с которым нам потребуется несколько структур, GUID'ов и констант, про которые не знает FASM.
  1. ; GUID {0968E258-16C7-4DBA-AA86-462DD61E31A3}
  2. CLSID_PersistentZoneIdentifier \
  3.     dd 00968E258h
  4.     dw 016C7h
  5.     dw 04DBAh
  6.     db 0AAh, 086h, 046h, 02Dh, 0D6h, 01Eh, 031h, 0A3h
  7.  
  8. ; GUID {CD45F185-1B21-48E2-967B-EAD743A8914E}
  9. IID_IZoneIdentifier \
  10.     dd 0CD45F185h
  11.     dw 01B21h
  12.     dw 048E2h
  13.     db 096h, 07Bh, 0EAh, 0D7h, 043h, 0A8h, 091h, 04Eh
  14.  
  15. ; GUID {0000010B-0000-0000-C000-000000000046}
  16. IID_IPersistFile \
  17.     dd 00000010Bh
  18.     dw 00000h
  19.     dw 00000h
  20.     db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
  21.  
  22. ; IID_IZoneIdentifier Interface
  23. struct IZoneIdentifier
  24.     ; IUnknown
  25.     QueryInterface dd ?   ; 000h
  26.     AddRef         dd ?   ; 004h
  27.     Release        dd ?   ; 008h
  28.     ; IZoneIdentifier
  29.     GetId          dd ?   ; 00Ch
  30.     SetId          dd ?   ; 010h
  31.     Remove         dd ?   ; 014h
  32. ends
  33.  
  34. ; IID_IPersistFile Interface
  35. struct IPersistFile
  36.     ; IUnknown
  37.     QueryInterface dd ?   ; 000h
  38.     AddRef         dd ?   ; 004h
  39.     Release        dd ?   ; 008h
  40.     ; IPersistFile
  41.     GetClassID     dd ?   ; 00Ch
  42.     IsDirty        dd ?   ; 010h
  43.     Load           dd ?   ; 014h
  44.     Save           dd ?   ; 018h
  45.     SaveCompleted  dd ?   ; 01Ch
  46.     GetCurFile     dd ?   ; 020h
  47. ends
  48.  
  49. CLSCTX_INPROC_SERVER = 1
  50. S_OK                 = 0
  51. STGM_READ            = 0
Интерфейс IZoneIdentifier предоставляет три метода для работы с Zone.Identifier: получение текущего значения, установка или изменение идентификатора и его полное удаление.

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

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.09 сек. / MySQL: 3 (0.0287 сек.) / Память: 4.5 Mb
Наверх