Advertisement
krot

WNDPROC

May 21st, 2018
282
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .586P
  2. .MODEL FLAT,STDCALL
  3.  
  4.  ; константы
  5. ; сообщение приходит при закрытии окна
  6. WM_DESTROY equ 2
  7. ; сообщение приходит при создании окна
  8. WM_CREATE equ 1
  9. ; сообщение при щелчке левой кнопкой мыши в области окна
  10. WM_LBUTTONDOWN equ 201h
  11. ; сообщение при щелчке правой кнопкой мыши в области окна
  12. WM_RBUTTONDOWN equ 204h
  13. ; свойства окна
  14. CS_VREDRAW equ 1h
  15. CS_HREDRAW equ 2h
  16. CS_GLOBALCLASS equ 4000h
  17. WS_OVERLAPPEDWINDOW equ 000CF0000H
  18. style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
  19. ; идентификатор стандартной иконки
  20. IDI_APPLICATION equ 32512
  21. ; идентификатор курсора
  22. IDC_CROSS equ 32515
  23. ; режим показа окна - нормальный
  24. SW_SHOWNORMAL equ 1
  25. ;не удалять из очер
  26. PM_NOREMOVE                          equ 0h
  27.  
  28. ; прототипы внешних процедур
  29. EXTERN MessageBoxA@16: NEAR
  30. EXTERN CreateWindowExA@48:NEAR
  31. EXTERN DefWindowProcA@16:NEAR
  32. EXTERN DispatchMessageA@4:NEAR
  33. EXTERN ExitProcess@4:NEAR
  34. EXTERN GetMessageA@16:NEAR
  35. EXTERN PeekMessageA@20:NEAR
  36. EXTERN GetModuleHandleA@4:NEAR
  37. EXTERN LoadCursorA@8:NEAR
  38. EXTERN LoadIconA@8:NEAR
  39. EXTERN PostQuitMessage@4:NEAR
  40. EXTERN RegisterClassA@4:NEAR
  41. EXTERN ShowWindow@8:NEAR
  42. EXTERN TranslateMessage@4:NEAR
  43. EXTERN UpdateWindow@4:NEAR
  44.  
  45.  
  46. include /masm32/include/user32.inc
  47. include /masm32/include/kernel32.inc
  48.  
  49. includelib /masm32/lib/user32.lib
  50. includelib /masm32/lib/kernel32.lib
  51.  
  52.  
  53.  
  54. ; структуры
  55. ; структура сообщения
  56. MSGSTRUCT STRUC
  57.     MSHWND DD ? ; идентификатор окна,
  58.     ; получающего сообщение
  59.     MSMESSAGE DD ? ; идентификатор сообщения
  60.     MSWPARAM DD ? ; доп. информация о сообщении
  61.     MSLPARAM DD ? ; доп. информация о сообщении
  62.     MSTIME DD ? ; время посылки сообщения
  63.     MSPT DD ? ; положение курсора, во время посылки
  64.     ; сообщения
  65. MSGSTRUCT ENDS
  66.  
  67. ;---------
  68. WNDCLASS STRUC
  69.     CLSSTYLE DD ? ; стиль окна
  70.     CLWNDPROC DD ? ; указатель на процедуру окна
  71.     CLSCEXTRA DD ? ; информация о доп. байтах для
  72.     ; данной структуры
  73.     CLWNDEXTRA DD ? ; информация о доп. байтах для окна
  74.     CLSHINSTANCE DD ? ; дескриптор приложения
  75.     CLSHICON DD ? ; идентификатор иконы окна
  76.     CLSHCURSOR DD ? ; идентификатор курсора окна
  77.     CLBKGROUND DD ? ; идентификатор кисти окна
  78.     CLMENUNAME DD ? ; имя-идентификатор меню
  79.     CLNAME DD ? ; специфицирует имя класса окон
  80. WNDCLASS ENDS
  81.  
  82.  
  83. _DATA SEGMENT
  84.     msg_title db "Title", 0
  85.     msg_message db "Hello world", 0
  86.     HW DWORD ?
  87.  
  88.     NEWHWND DD 0
  89.     MSG MSGSTRUCT <?>
  90.     WC WNDCLASS <?>
  91.     HINST DD 0 ; здесь хранится дескриптор приложения
  92.     TITLENAME DB 'Простой пример 32-битного приложения',0
  93.     CLASSNAME DB 'CLASS32',0
  94.     CAP DB 'Сообщение',0
  95.     MES1 DB 'Вы нажали левую кнопку мыши',0
  96.     MES2 DB 'Выход из программы. Пока!',0
  97. _DATA ENDS
  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99. _TEXT SEGMENT
  100. START:
  101.  
  102. ;PUSH 0
  103. ;PUSH OFFSET msg_title
  104. ;PUSH OFFSET msg_message
  105. ;PUSH HW
  106. ;CALL MessageBoxA@16
  107. ;invoke Beep, 100,1000
  108.  
  109. ; получить дескриптор приложения
  110.     PUSH 0
  111.     CALL GetModuleHandleA@4
  112.     MOV [HINST], EAX
  113. REG_CLASS:
  114. ; заполнить структуру окна стиль
  115.     MOV [WC.CLSSTYLE], style
  116.     ; процедура обработки сообщений
  117.     MOV [WC.CLWNDPROC], OFFSET WNDPROC
  118.     MOV [WC.CLSCEXTRA], 0
  119.     MOV [WC.CLWNDEXTRA], 0
  120.     MOV EAX, [HINST]
  121.     MOV [WC.CLSHINSTANCE], EAX
  122. ;--------- иконка окна
  123.     PUSH IDI_APPLICATION
  124.     PUSH 0
  125.     CALL LoadIconA@8
  126.     MOV [WC.CLSHICON], EAX
  127. ;---------- курсор окна
  128.     PUSH IDC_CROSS
  129.     PUSH 0
  130.     CALL LoadCursorA@8
  131.     MOV [WC.CLSHCURSOR], EAX
  132. ;---------
  133.     MOV [WC.CLBKGROUND], 17 ; цвет окна
  134.     MOV DWORD PTR [WC.CLMENUNAME], 0
  135.     MOV DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
  136.     PUSH OFFSET WC
  137.     CALL RegisterClassA@4
  138. ; создать окно зарегистрированного класса
  139.     PUSH 0
  140.     PUSH [HINST]
  141.     PUSH 0
  142.     PUSH 0
  143.     PUSH 400 ; DY — высота окна
  144.     PUSH 400 ; DX - ширина окна
  145.     PUSH 100 ; Y — координата левого верхнего угла
  146.     PUSH 100 ; X — координата левого верхнего угла
  147.     PUSH WS_OVERLAPPEDWINDOW
  148.     PUSH OFFSET TITLENAME ; имя окна
  149.     PUSH OFFSET CLASSNAME ; имя класса
  150.     PUSH 0
  151.     CALL CreateWindowExA@48
  152.     ; проверка на ошибку
  153.     CMP EAX, 0
  154.     JZ _ERR
  155.     MOV [NEWHWND], EAX ; дескриптор окна
  156. ; --------------------------------------------------
  157.     PUSH SW_SHOWNORMAL
  158.     PUSH [NEWHWND]
  159.     CALL ShowWindow@8; показать созданное окно
  160. ; --------------------------------------------------
  161.     ;PUSH [NEWHWND]
  162.     ;CALL UpdateWindow@4 ; команда перерисовать видимую
  163. ;------------------------------------------------------
  164. ; цикл обработки сообщений
  165. MSG_LOOP:
  166.     PUSH PM_NOREMOVE
  167.     PUSH 0
  168.     PUSH 0
  169.     PUSH 0
  170.     PUSH OFFSET MSG
  171.     CALL PeekMessageA@20
  172.     CMP EAX,0
  173.     JZ NO_MES
  174.    
  175.     PUSH 0
  176.     PUSH 0
  177.     PUSH 0
  178.     PUSH OFFSET MSG
  179.     CALL GetMessageA@16
  180.     CMP EAX, 0
  181.     JE END_LOOP
  182.     PUSH OFFSET MSG
  183.     CALL TranslateMessage@4
  184.     PUSH OFFSET MSG
  185.     CALL DispatchMessageA@4
  186.     JMP MSG_LOOP
  187.     NO_MES:
  188.         NOP
  189.         NOP
  190.         NOP
  191.     JMP MSG_LOOP
  192. END_LOOP:
  193. ; выход из программы (закрыть процесс)
  194.     PUSH [MSG.MSWPARAM]
  195.     CALL ExitProcess@4
  196. _ERR:
  197. JMP END_LOOP
  198. ; --------------------------------------------------
  199. ; процедура окна
  200. ; расположение параметров в стеке
  201. ; [EBP+014H] LPARAM
  202. ; [EBP+10H] WAPARAM
  203. ; [EBP+0CH] MES
  204. ; [EBP+8] HWND
  205. WNDPROC PROC
  206.     PUSH EBP
  207.     MOV EBP, ESP
  208.     PUSH EBX
  209.     PUSH ESI
  210.     PUSH EDI
  211.     CMP DWORD PTR [EBP+0CH], WM_DESTROY
  212.     JE WMDESTROY
  213.     CMP DWORD PTR [EBP+0CH], WM_CREATE
  214.     JE WMCREATE
  215.     CMP DWORD PTR [EBP+0CH] ,WM_LBUTTONDOWN ;левая кнопка
  216.     JE LBUTTON
  217.     CMP DWORD PTR [EBP+0CH] ,WM_RBUTTONDOWN ;правая кнопка
  218.     JE RBUTTON
  219.     JMP DEFWNDPROC
  220. ; нажатие правой кнопки приводит к закрытию окна
  221. RBUTTON:
  222.     JMP WMDESTROY
  223. ; нажатие левой кнопки мыши
  224. LBUTTON:
  225.     ; выводим сообщение
  226.     PUSH 0 ; МВ_ОК
  227.     PUSH OFFSET CAP
  228.     PUSH OFFSET MES1
  229.     PUSH DWORD PTR [EBP+08H]
  230.     CALL MessageBoxA@16
  231.     MOV EAX, 0
  232.     JMP FINISH
  233. WMCREATE:
  234.     MOV EAX, 0
  235.     JMP FINISH
  236. DEFWNDPROC:
  237.     PUSH DWORD PTR [EBP+14H]
  238.     PUSH DWORD PTR [EBP+10H]
  239.     PUSH DWORD PTR [EBP+0CH]
  240.     PUSH DWORD PTR [EBP+08H]
  241.     CALL DefWindowProcA@16
  242.     JMP FINISH
  243. WMDESTROY:
  244.     PUSH 0 ; МВ_ОК
  245.     PUSH OFFSET CAP
  246.     PUSH OFFSET MES2
  247.     PUSH DWORD PTR [EBP+08H] ; дескриптор окна
  248.     CALL MessageBoxA@16
  249.     ;отправить WM_QUIT сам себе
  250.     PUSH 0
  251.     CALL PostQuitMessage@4 ; сообщение WM_QUIT
  252.     MOV EAX, 0
  253. FINISH:
  254.     POP EDI
  255.     POP ESI
  256.     POP EBX
  257.     POP EBP
  258.     RET 16
  259. WNDPROC ENDP
  260.  
  261. _TEXT ENDS
  262. END START
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement