Blog. Just Blog

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

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

Работа с кнопкой Help в заголовке окна

28.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
В самом начале развития Windows во многих приложениях очень часто встречалась кнопка "Help" в заголовке окна. Кликнув на нее и переместив курсор на нужный элемент, пользователь мог получить подсказку, например, какие данные надо вводить в конкретное текстовое поле или что получится, если нажать какую-нибудь кнопку. Сейчас UIX-дизайнеры прокачали свои навыки, кнопка справки стала уже не так популярна, по крайней мере я не встречал ее ни в одном современном приложении. Но может быть кому-нибудь будет интересно, как ей пользоваться и как правильно обрабатывать ее сообщения. Начнем с интерфейса. Чтобы в заголовке окна появилась кнопка справки, оно должно быть изначально создано с расширенным стилем WS_EX_CONTEXTHELP. Для динамического управления кнопкой справки можно воспользоваться способом, описанным в этой статье.

Из программной части нам понадобится одна структура, которую почему-то не знает коробочный FASM. Хотя, блин, чему я удивляюсь...
  1. struct HELPINFO
  2.         cbSize       dd ?
  3.         iContextType dd ?
  4.         iCtrlId      dd ?
  5.         hItemHandle  dd ?
  6.         dwContextId  dd ?
  7.         MousePos     POINT
  8. ends
Суть контекстной справки заключается в том, чтобы при выборе пользователем какого-либо элемента диалогового окна, ему была предоставлена информация именно по этому элементу. Для персонализации справки можно назначить конкретному элементу окна контекстный идентификатор справки при помощи функции SetWindowContextHelpId. Это один из вариантов, с помощью которого в дальнейшем можно будет персонализировать справку.
  1. .wminitdialog:
  2.         ; Назначить контекстный идентификатор справки элементу окна
  3.         invoke  GetDlgItem,[hwnddlg],ID_BUTTON_1
  4.         invoke  SetWindowContextHelpId,eax,777
При нажатии кнопки справки в заголовке окна и выборе какого-нибудь элемента диалогового окна, родительскому окну отправляется сообщение WM_HELP, которое мы должны обработать.

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

Системные генераторы случайных чисел

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

Системные генераторы случайных чисел

На сайте уже выложено несколько различных алгоритмов генераторов псевдослучайных чисел. Какие-то генераторы лучше, какие-то похуже. Но когда надо сгенерировать всего пару-тройку чисел или результаты генерации не используются в критических участках кода, можно воспользоваться системными источниками псевдослучайных чисел.

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

Генератор xoshiro128 на Ассемблере

05.07.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
Семейство xoshiro (xoroshiro) - это высокоскоростные и очень эффективные алгоритмы генерации псевдослучайных чисел общего назначения с хорошим распределением. Свое название генераторы получили от используемых в них операций XOR/Shift/Rotate. Разные варианты генераторов используют для рабочего буфера разные объемы памяти, а также реализованы как в 64-битной, так и в 32-битной версии. У меня тут будет 32-битный вариант xoshiro128 с периодом 2128.

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

Переходим к программированию. Как можно догадаться из суффикса названия, для работы генератора потребуется 128 бит, то есть 4 DWORD'а.
  1. ;---------------------------------------------
  2. ; Данные для генератора случайных чисел
  3.  
  4. s  rd 4
Дальше выполняется инициализация. В оригинальном алгоритме есть два варианта инициализации - "короткая" и "длинная". Они отличаются только количеством холостых прокруток генератора, соответственно, 264 и 296 раз. Я решил использовать второй вариант.
  1. ;---------------------------------------------
  2. ; Инициализация генератора случайных чисел
  3. ; stdcall long_jump,seed
  4. ;---------------------------------------------
  5. proc long_jump seed:DWORD
  6.         locals
  7.              s0 dd ?
  8.              s1 dd ?
  9.              s2 dd ?
  10.              s3 dd ?
  11.         endl
  12.  
  13.         pusha
  14.  
  15.         ; Начальное "засеивание" генератора
  16.         mov     edi,s
  17.         mov     eax,[seed]
  18.         rol     eax,1
  19.         xor     eax,0x1C580662
  20.         stosd
  21.         rol     eax,3
  22.         add     eax,0x0B6F099F
  23.         stosd
  24.         rol     eax,5
  25.         xor     eax,0xB523952E
  26.         stosd
  27.         rol     eax,7
  28.         sub     eax,0xCCF5A0EF
  29.         stosd
  30.  
  31.         ; Холостая прокрутка генератора для инициализации
  32.         lea     edi,[s0]
  33.         push    edi
  34.         xor     eax,eax
  35.         stosd
  36.         stosd
  37.         stosd
  38.         stosd
  39.  
  40.         xor     ebx,ebx
  41. .loc_for_1:
  42.         xor     ecx,ecx
  43. .loc_for_2:
  44.         mov     eax,[.lj+ebx*4]
  45.         and     eax,1
  46.         shl     eax,cl
  47.         jz      @f
  48.  
  49.         mov     esi,s
  50.         lodsd
  51.         xor     [s0],eax
  52.         lodsd
  53.         xor     [s1],eax
  54.         lodsd
  55.         xor     [s2],eax
  56.         lodsd
  57.         xor     [s3],eax
  58. @@:
  59.         stdcall next
  60.  
  61.         inc     ecx
  62.         cmp     ecx,32
  63.         jb      .loc_for_2
  64.  
  65.         inc     ebx
  66.         cmp     ebx,4
  67.         jb      .loc_for_1
  68.  
  69.         pop     esi
  70.         mov     edi,s
  71.         movsd
  72.         movsd
  73.         movsd
  74.         movsd
  75.  
  76.         popa
  77.         ret
  78.  
  79. .lj:    dd 0xB523952E
  80.         dd 0x0B6F099F
  81.         dd 0xCCF5A0EF
  82.         dd 0x1C580662
  83. endp
Также стоит упомянуть начальное "засеивание" рабочего буфера генератора. В комментариях к оригинальному коду просто сказано, что буфер не должен быть полностью нулевым, а все действия по его заполнению отдаются целиком на откуп программиста. Я добавил свой вариант заполнения, который показался мне рабочим, вы можете заменить его на любой другой. В принципе, достаточно инициализировать ненулевым значением любой из четырех DWORD'ов буфера.

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

Обработка изменения иконок в системном трее

19.06.2021 | Категория: Образ мышления: Assembler | Автор: ManHunter
С обновлением иконок в системном трее разобрались, теперь давайте разберем, как можно отслеживать изменения в трее. Причем изменения касаются не только добавления-удаления иконок, но также изменения всплывающих подсказок и изменения иконки с сохранением ее индекса.
  1. CLSCTX_LOCAL_SERVER = 0x04
  2. S_OK = 0
  3.  
  4. struct NOTIFYITEM
  5.     pszExeName   dd ?
  6.     pszTip       dd ?
  7.     hIcon        dd ?
  8.     hWnd         dd ?
  9.     dwPreference dd ?
  10.     uID          dd ?
  11.     guidItem     rd 4
  12. ends
  13.  
  14. ; GUID {D782CCBA-AFB0-43F1-94DB-FDA3779EACCB}
  15. IID_INotificationCB dd 0D782CCBAh
  16.                     dw 0AFB0h
  17.                     dw 043F1h
  18.                     db 094h, 0DBh, 0FDh, 0A3h, 077h, 09Eh, 0ACh, 0CBh
  19.  
  20. ; INotificationCB interface
  21. struct INotificationCB
  22.         QueryInterface dd ?
  23.         AddRef         dd ?
  24.         Release        dd ?
  25.         ; INotificationCB
  26.         Notify         dd ?
  27. ends
  28.  
  29. ; GUID {FB852B2C-6BAD-4605-9551-F15F87830935}
  30. IID_ITrayNotify dd 0FB852B2Ch
  31.                 dw 06BADh
  32.                 dw 04605h
  33.                 db 095h, 051h, 0F1h, 05Fh, 087h, 083h, 009h, 035h
  34.  
  35. ; ITrayNotify interface
  36. struct ITrayNotify
  37.         QueryInterface   dd ?
  38.         AddRef           dd ?
  39.         Release          dd ?
  40.         ; ITrayNotify
  41.         RegisterCallback dd ?
  42.         SetPreference    dd ?
  43.         EnableAutoTray   dd ?
  44. ends
  45.  
  46. ; GUID {25DEAD04-1EAC-4911-9E3A-AD0A4AB560FD}
  47. CLSID_TrayNotify dd 025DEAD04h
  48.                  dw 01EACh
  49.                  dw 04911h
  50.                  db 09Eh, 03Ah, 0ADh, 00Ah, 04Ah, 0B5h, 060h, 0FDh
  51.  
  52. ; GUID {00000000-0000-0000-C000-000000000046}
  53. IID_IUnknown dd 000000000h
  54.              dw 00000h
  55.              dw 00000h
  56.              db 0C0h, 000h, 000h, 000h, 000h, 000h, 000h, 046h
Практически все, что тут используется, относится к недокументированным функциям Windows, поэтому внимательно смотрите примеры и описания. И да, работает оно только на современных системах, начиная с Windows Vista.

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

GUID Helper 1.3

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

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

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

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

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