1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

Уроки Iczelion'а от Sulaiman Chang на диалекте FASM

Тема в разделе "FASM", создана пользователем Mikl___, 12 дек 2016.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Содержание



    1. Win32 API. Урок 2. MessageBox
    2. Win32 API. Урок 3. Простое окно
    3. Win32 API. Урок 4. Отрисовка текста
    4. Win32 API. Урок 5. Больше о тексте
    5. Win32 API. Урок 6. Клавиатура
    6. Win32 API. Урок 7. Мышь
    7. Win32 API. Урок 8. Меню
    8. Win32 API. Урок 9. Дочерние окна
    9. Win32 API. Урок 10. Диалоговое окно как основное
      a. CreateDialogParam+DlgProc
      b. CreateDialogParam+DlgProc+WndProc
      c. CreateDialogParam+WndProc+Class
      d. DialogBoxParam+DlgProc
      e. CreateDialogParam+DlgProc+WndProc
      f. DialogBoxParam+WndProc+Class
      g
      h
      i
      j
      k
      l
    10. Win32 API. Урок 11. Больше о диалоговых окнах
    11. Win32 API. Урок 12. Память и файлы
    12. Win32 API. Урок 13. Memory Mapped файлы
    13. Win32 API. Урок 14. Процесс
    14. Win32 API. Урок 15. Треды (ветви)
    15. Win32 API. Урок 16. Объект события
    16. Win32 API. Урок 17. Динамические библиотеки
    17. Win32 API. Урок 18. Простые управляющие элементы
    18. Win32 API. Урок 19. Tree View Control
    19. Win32 API. Урок 20. Сабклассинг окна
    20. Win32 API. Урок 21. Пайп
    21. Win32 API. Урок 22. Суперклассинг
    22. Win32 API. Урок 23. Иконка в system tray
    23. Win32 API. Урок 24. Windows-хуки
    24. Win32 API. Урок 25. Вывод картинки на экран
    25. Win32 API. Урок 26. Экран-заставка
    26. Win32 API. Урок 27. Тултип-контрол
    27. Win32 API. Урок 28. Debug API часть первая
    28. Win32 API. Урок 29. Debug API часть вторая
    29. Win32 API. Урок 30. Debug API часть третья
    30. Win32 API. Урок 31. Контрол Listview
    31. Win32 API. Урок 32. Создание MDI-приложения
    32. Разное. Как создать invoke'абельную библиотеку импорта
    33. Формат PE. Урок 1. Обзор PE формата
    34. Формат PE. Урок 2. Правильность PE файла
    35. Формат PE. Урок 3. Файловый заголовок
    36. Формат PE. Урок 4. Опциональный заголовок
    37. Формат PE. Урок 5. Таблица секций
    38. Формат PE. Урок 6. Таблица импорта
    39. Формат PE. Урок 7. Таблица экспорта
     
    Последнее редактирование: 17 дек 2016
    rococo795 нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 2. MessageBox

    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, code, data in the same section
    4.    invoke MessageBox,NULL,wText,wTitle,MB_OK
    5.    retn
    6. wTitle   db   'Iczelion Tutorial #2:MessageBox',0
    7. wText     db   'Win32 Assembly with FASM is Great!',0
    8. data import
    9.  library user32,'USER32.DLL'
    10.  import user32,\
    11. MessageBox,'MessageBoxA'
    12. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_02.png
      tut_02.png
      Размер файла:
      14 КБ
      Просмотров:
      3.695
    • tut_02.zip
      Размер файла:
      810 байт
      Просмотров:
      521
    Последнее редактирование: 15 дек 2016
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 3. Простое окно


    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, code, data in the same section
    4.  xor ebx,ebx
    5.  mov edi,wTitle
    6.  mov esi,400000h
    7.  ; +------------------------------+
    8.  ; | registering the window class |
    9.  ; +------------------------------+
    10.  invoke RegisterClass,esp,ebx,window_procedure,ebx,\
    11.  ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    12.  ; +--------------------------+
    13.  ; | creating the main window |
    14.  ; +--------------------------+
    15.  push ebx esi ebx ebx
    16.  shl esi,9;400000h * 200h = 80000000h = CW_USEDEFAULT
    17.  invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\
    18.  esi,esi,esi,esi
    19.  mov ebp,esp
    20.  ; +---------------------------+
    21.  ; | entering the message loop |
    22.  ; +---------------------------+
    23. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    24.  invoke DispatchMessage,ebp
    25.  jmp message_loop
    26.  ; +----------------------+
    27.  ; | the window procedure |
    28.  ; +----------------------+
    29. window_procedure: cmp dword[esp+8],WM_DESTROY
    30.       je wmDESTROY
    31.       jmp dword [DefWindowProc]
    32. wmDESTROY: invoke ExitProcess,ebx
    33. wTitle db   'Iczelion Tutorial #3:The Simplest Window in FASM',0 ;name and class of our window
    34. data import
    35.  library KERNEL32, 'KERNEL32.DLL',\
    36. user32,   'USER32.DLL'
    37.  import KERNEL32,\
    38.       ExitProcess,   'ExitProcess'
    39.  import user32,\
    40. RegisterClass,    'RegisterClassA',\
    41. CreateWindowEx,     'CreateWindowExA',\
    42. DefWindowProc,    'DefWindowProcA',\
    43. GetMessage,    'GetMessageA',\
    44. DispatchMessage,    'DispatchMessageA'
    45. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_03.png
      tut_03.png
      Размер файла:
      21,6 КБ
      Просмотров:
      3.631
    • tut_03.zip
      Размер файла:
      1,3 КБ
      Просмотров:
      464
    Последнее редактирование: 15 дек 2016
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 4. Отрисовка текста


    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, code, data in the same section
    4.  xor ebx,ebx
    5.  mov edi,wTitle
    6.  mov esi,400000h
    7.  ; +------------------------------+
    8.  ; | registering the window class |
    9.  ; +------------------------------+
    10.  invoke RegisterClass,esp,CS_HREDRAW or CS_VREDRAW,WndProc,ebx,\
    11.  ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    12.  ; +--------------------------+
    13.  ; | creating the main window |
    14.  ; +--------------------------+
    15.  push ebx esi ebx ebx
    16.  shl esi,9
    17.  invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\
    18.  esi,esi,esi,esi
    19.  mov ebp,esp
    20.  ; +---------------------------+
    21.  ; | entering the message loop |
    22.  ; +---------------------------+
    23. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    24.  invoke DispatchMessage,ebp
    25.  jmp message_loop
    26.  ; +----------------------+
    27.  ; | the window procedure |
    28.  ; +----------------------+
    29. proc WndProc hWnd, uMsg, wParam, lParam
    30. local ps:PAINTSTRUCT
    31. local expRect:RECT
    32. mov eax,[uMsg]
    33. mov edi,[hWnd]
    34. dec eax; cmp uMsg,WM_DESTROY
    35. dec eax
    36. je wmDESTROY
    37. sub eax,WM_PAINT-WM_DESTROY; cmp uMsg,WM_PAINT
    38. je   wmPAINT
    39. leave
    40. jmp dword [DefWindowProc]
    41. wmPAINT: invoke BeginPaint,edi,esp
    42. lea esi,[expRect]
    43. invoke GetClientRect,edi,esi,eax
    44. invoke DrawText,dword[esp+16],expTxt,-1,esi,DT_SINGLELINE or DT_CENTER or DT_VCENTER
    45. invoke EndPaint,edi,esp
    46. ret
    47. wmDESTROY: invoke ExitProcess,eax
    48. endp
    49.       wTitle db   'Iczelion Tutorial #4:Painting with Text',0 ;name of our window
    50.       expTxt db   'Win32 assembly with FASM is great and easy',0
    51. data import
    52.  library KERNEL32, 'KERNEL32.DLL',\
    53. user32,   'USER32.DLL'
    54.  import KERNEL32,\
    55.       ExitProcess,   'ExitProcess'
    56.  import user32,\
    57. RegisterClass,    'RegisterClassA',\
    58. CreateWindowEx,     'CreateWindowExA',\
    59. DefWindowProc,    'DefWindowProcA',\
    60. GetMessage,    'GetMessageA',\
    61. BeginPaint,    'BeginPaint',\
    62. GetClientRect,    'GetClientRect',\
    63. DrawText,    'DrawTextA',\
    64. EndPaint,    'EndPaint',\
    65. DispatchMessage,    'DispatchMessageA'
    66. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_04.png
      tut_04.png
      Размер файла:
      14,4 КБ
      Просмотров:
      3.645
    • tut_04.zip
      Размер файла:
      1,7 КБ
      Просмотров:
      312
    Последнее редактирование: 15 дек 2016
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 5. Больше о тексте


    исходный текст и ехе-файл здесь
    Код (ASM):
    1.  
    2. format PE GUI
    3. include 'win32ax.inc'
    4. ; import data in the same section
    5.  xor ebx,ebx
    6.  mov edi,wTitle
    7.  mov esi,400000h
    8.  ; +------------------------------+
    9.  ; | registering the window class |
    10.  ; +------------------------------+
    11.  invoke RegisterClass,esp,ebx,WndProc,\
    12.  ebx,ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    13.  ; +--------------------------+
    14.  ; | creating the main window |
    15.  ; +--------------------------+
    16.  push ebx esi ebx ebx
    17.  shl esi,9
    18.  invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+WS_VISIBLE,\
    19.  esi,esi,esi,esi
    20.  mov ebp,esp
    21.  ; +---------------------------+
    22.  ; | entering the message loop |
    23.  ; +---------------------------+
    24. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    25.  invoke DispatchMessage,ebp
    26.  jmp message_loop
    27.  ; +----------------------+
    28.  ; | the window procedure |
    29.  ; +----------------------+
    30. proc WndProc hWnd, uMsg, wParam, lParam
    31. local ps:PAINTSTRUCT
    32. mov eax,[uMsg]
    33. mov edi,[hWnd]
    34. dec eax; cmp uMsg,WM_DESTROY
    35. dec eax
    36. je .wmDESTROY
    37. sub eax,WM_PAINT-WM_DESTROY; cmp uMsg,WM_PAINT
    38. je .wmPAINT
    39. leave
    40. jmp dword [DefWindowProc]
    41. .wmPAINT:invoke BeginPaint,edi,esp
    42. invoke    GetCurrentObject,eax,ebx;OBJ_FONT
    43. invoke    CreateFont,26,12,ebx,ebx,400,ebx,ebx,ebx,\
    44.   -1,\;OEM_CHARSET,\
    45.   ebx,\;OUT_DEFAULT_PRECIS,\
    46.   ebx,\;CLIP_DEFAULT_PRECIS,\
    47.   ebx,\;DEFAULT_QUALITY,\
    48.   DEFAULT_PITCH or FF_SCRIPT,\
    49.   fontname,eax ;default font object
    50.    invoke    SelectObject,dword[esp+8],eax
    51.    invoke    SetTextColor,dword[esp+8],0x32C8C8;RGB=50,200,200
    52.    invoke    SetBkColor,dword[esp+8],0xFF0000;RGB=0,0,255
    53.    invoke    TextOut,dword[esp+20],ebx,ebx,expTxt,Num
    54.    invoke    SelectObject,dword[esp];esi
    55.    invoke    EndPaint,edi,esp
    56.    ret
    57. .wmDESTROY: invoke ExitProcess,ebx
    58. endp
    59. ;-------------------------------------------------------------------------------
    60.      ;exp = experiment
    61. fontname db "script",0
    62. wTitle db   'Iczelion Tutorial #5:More about Text',0 ;name of our window
    63. expTxt db   'Win32 assembly with FASM is great and easy'
    64. Num = $ - expTxt
    65. data import
    66.  library KERNEL32, 'KERNEL32.DLL',\
    67. GDI32,    'GDI32.DLL',\
    68. user32,   'USER32.DLL'
    69.  import KERNEL32,\
    70.       ExitProcess,   'ExitProcess'
    71.  import user32,\
    72. RegisterClass,    'RegisterClassA',\
    73. CreateWindowEx,     'CreateWindowExA',\
    74. DefWindowProc,    'DefWindowProcA',\
    75. GetMessage,    'GetMessageA',\
    76. BeginPaint,    'BeginPaint',\
    77. EndPaint,    'EndPaint',\
    78. DispatchMessage,    'DispatchMessageA'
    79.   import    GDI32,\
    80.       CreateFont,   'CreateFontA',\
    81.       SetTextColor,   'SetTextColor',\
    82.       SetBkColor,   'SetBkColor',\
    83.       TextOut,   'TextOutA',\
    84.       GetCurrentObject,   'GetCurrentObject',\
    85.       SelectObject,   'SelectObject'
    86. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_05.png
      tut_05.png
      Размер файла:
      22,8 КБ
      Просмотров:
      3.631
    • tut_05.zip
      Размер файла:
      2 КБ
      Просмотров:
      356
    Последнее редактирование: 13 дек 2016
  6. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 6. Клавиатура


    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, code, data in the same section
    4.           xor ebx,ebx
    5.           mov edi,wTitle
    6.           mov esi,400000h
    7.           ; +------------------------------+
    8.           ; | registering the window class |
    9.           ; +------------------------------+
    10.           invoke RegisterClass,esp,ebx,WndProc,ebx,\
    11.           ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    12.           ; +--------------------------+
    13.           ; | creating the main window |
    14.           ; +--------------------------+
    15.           push ebx esi ebx ebx
    16.           shl esi,9
    17.           invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+\
    18.           WS_VISIBLE,esi,esi,512,352
    19.           mov ebp,esp
    20.           ; +---------------------------+
    21.           ; | entering the message loop |
    22.           ; +---------------------------+
    23. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    24.           invoke TranslateMessage,ebp
    25.           invoke DispatchMessage,ebp
    26.           jmp message_loop
    27.           ; +----------------------+
    28.           ; | the window procedure |
    29.           ; +----------------------+
    30. proc WndProc hWnd, uMsg, wParam, lParam
    31. local ps:PAINTSTRUCT
    32.                         mov eax,[uMsg]
    33.                         mov edi,[hWnd]
    34.                         mov esi,expChar
    35.                         dec eax; cmp uMsg,WM_DESTROY
    36.                         dec eax
    37.                         je .wmDESTROY
    38.                         sub eax,WM_PAINT-WM_DESTROY; cmp uMsg,WM_PAINT
    39.                         je .wmPAINT
    40.                         sub eax,WM_CHAR-WM_PAINT
    41.                         je .wmCHAR
    42.                         leave
    43.                         jmp dword [DefWindowProc]
    44. .wmCHAR:        push dword [wParam]
    45.                         pop dword  [esi]
    46.                         invoke InvalidateRect,edi,eax,TRUE
    47.                         jmp .wmBYE
    48. .wmPAINT:       invoke BeginPaint,edi,esp
    49.                         invoke TextOut,eax,142,90,Message,expChar-Message-1
    50.                         invoke TextOut,dword[esp+16],242,150,esi,1
    51.                         invoke EndPaint,edi,esp
    52. .wmBYE:         ret
    53. .wmDESTROY:      invoke ExitProcess,eax
    54. endp
    55.      ;exp = experiment
    56.       wTitle    db   'Iczelion Tutorial #6:Keyboard Input in FASM',0 ;name of our window
    57.       Message   db 'Нажмите любую клавишу',0
    58.       expChar   dd '?'
    59. data import
    60.  library KERNEL32, 'KERNEL32.DLL',\
    61.          user32,   'USER32.DLL',\
    62.          GDI32,    'GDI32.DLL'
    63.  import KERNEL32,\
    64.                ExitProcess,        'ExitProcess'
    65.  import user32,\
    66.                 RegisterClass,      'RegisterClassA',\
    67.                 CreateWindowEx,     'CreateWindowExA',\
    68.                 DefWindowProc,      'DefWindowProcA',\
    69.                 GetMessage,         'GetMessageA',\
    70.                 BeginPaint,         'BeginPaint',\
    71.                 EndPaint,           'EndPaint',\
    72.                 DispatchMessage,    'DispatchMessageA',\
    73.                 TranslateMessage,   'TranslateMessage',\
    74.                 InvalidateRect,     'InvalidateRect'
    75.   import    GDI32,\
    76.                TextOut,            'TextOutA'
    77. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_06.png
      tut_06.png
      Размер файла:
      22,3 КБ
      Просмотров:
      3.661
    • tut_06.zip
      Размер файла:
      1,8 КБ
      Просмотров:
      380
    Последнее редактирование: 15 дек 2016
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 7. Мышь


    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, code, data in the same section
    4. MAXRECTS = 40
    5.  xor ebx,ebx
    6.  mov edi,wTitle
    7.  mov esi,400000h
    8.  ; +------------------------------+
    9.  ; | registering the window class |
    10.  ; +------------------------------+
    11.  invoke RegisterClass,esp,ebx,WndProc,ebx,\
    12.  ebx,esi,ebx,10011h,COLOR_WINDOW+1,ebx,edi
    13.  ; +--------------------------+
    14.  ; | creating the main window |
    15.  ; +--------------------------+
    16.  push ebx esi ebx ebx
    17.  shl esi,9
    18.  invoke CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW+\
    19.  WS_VISIBLE,esi,esi,esi,esi
    20.  mov ebp,esp
    21.  ; +---------------------------+
    22.  ; | entering the message loop |
    23.  ; +---------------------------+
    24. message_loop: invoke GetMessage,ebp,ebx,ebx,ebx
    25.  invoke DispatchMessage,ebp
    26.  jmp message_loop
    27.  ; +----------------------+
    28.  ; | the window procedure |
    29.  ; +----------------------+
    30. proc WndProc hWnd, uMsg, wParam, lParam
    31. local ps:PAINTSTRUCT
    32. local Rect:RECT
    33.  mov eax,[uMsg]
    34.  mov edi,[hWnd]
    35.  dec eax; cmp uMsg,WM_DESTROY
    36.  dec eax
    37.  je .wmDESTROY
    38.  sub eax,WM_PAINT-WM_DESTROY; cmp uMsg,WM_PAINT
    39.  je .wmPAINT
    40.  sub eax,WM_LBUTTONDOWN-WM_PAINT;cmp eax,WM_LBUTTONDOWN
    41.  je .wmLBUTTONDOWN
    42.  sub eax,WM_RBUTTONDOWN-WM_LBUTTONDOWN
    43.  je .wmRBUTTONDOWN
    44.  leave
    45.  jmp dword [DefWindowProc]
    46. .wmPAINT:  mov ebx,[nextRect]
    47.  inc ebx;cmp nextRect,-1
    48.  jz .1
    49.  invoke BeginPaint,edi,esp
    50.  invoke SetBkMode,eax,TRANSPARENT
    51. .3:  mov edx,8
    52.  mov eax,[ebx*4+recs-4]
    53.  mov ecx,eax
    54.  shl ecx,1
    55.  jnc @f
    56.  shl edx,1
    57. @@:  shr ecx,17
    58.  push [PS+edx] [PS+edx+4] ecx
    59.  push word 0
    60.  push ax
    61.  invoke  TextOut,dword[esp+16]
    62.  dec  ebx
    63.  jnz .3
    64.  invoke EndPaint,edi,esp
    65.  jmp .1
    66. .wmLBUTTONDOWN:  mov eax,80000000h
    67. .wmRBUTTONDOWN:  add eax,[lParam]
    68.  cmp [nextRect],MAXRECTS-1
    69.  jge short @f
    70.  inc [nextRect]
    71.  mov ecx,[nextRect]
    72.  mov [ecx*4+recs],eax
    73.  movzx edx,ax
    74.  shl eax,1
    75.  shr eax,17
    76.  lea esi,[Rect]
    77.  mov [esi+RECT.left],edx
    78.  mov [esi+RECT.top],eax
    79.  add edx,150
    80.  mov [esi+RECT.right],edx
    81.  add eax,20
    82.  mov [esi+RECT.bottom],eax
    83.  invoke InvalidateRect,edi,esi,ebx
    84.  jmp .1
    85. @@:  invoke MessageBeep,ebx
    86. .1:  ret
    87. .wmDESTROY: invoke ExitProcess,ebx
    88. endp
    89. ;-------------------------------------------
    90.      ;exp = experiment
    91.       wTitle db   'Iczelion Tutorial #7:Mouse Input',0 ;name of our window
    92.       text1 db 'Нажата левая кнопка'
    93.       text2 db 'Нажата правая кнопка'
    94.       PS dd 0,0,text2-text1, text1, PS-text2, text2
    95.       recs dd MAXRECTS dup (?)
    96.       nextRect dd -1
    97. ;--------------------------------
    98. data import
    99.  library KERNEL32, 'KERNEL32.DLL',\
    100. user32,   'USER32.DLL',\
    101. GDI32,    'GDI32.DLL'
    102.  import KERNEL32,\
    103.       ExitProcess,   'ExitProcess'
    104.  import user32,\
    105. RegisterClass,    'RegisterClassA',\
    106. CreateWindowEx,     'CreateWindowExA',\
    107. DefWindowProc,    'DefWindowProcA',\
    108. GetMessage,    'GetMessageA',\
    109. BeginPaint,    'BeginPaint',\
    110. EndPaint,    'EndPaint',\
    111. DispatchMessage,    'DispatchMessageA',\
    112. InvalidateRect,     'InvalidateRect',\
    113. MessageBeep,    'MessageBeep'
    114.   import    GDI32,\
    115.       TextOut,   'TextOutA',\
    116.       SetBkMode,   'SetBkMode'
    117. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_07.png
      tut_07.png
      Размер файла:
      27,3 КБ
      Просмотров:
      3.614
    • tut_07.zip
      Размер файла:
      2,2 КБ
      Просмотров:
      289
    Последнее редактирование: 15 дек 2016
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 8. Меню


    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; code, import, data and resource  in the same section
    4.           xor ebx,ebx
    5.           mov edi,wTitle
    6.           mov esi,400000h
    7.           ; +------------------------------+
    8.           ; | registering the window class |
    9.           ; +------------------------------+
    10.           invoke    RegisterClass,esp,ebx,window_procedure,ebx,\
    11.           ebx,esi,ebx,10005h,COLOR_WINDOW+1,ebx,edi
    12.           invoke    LoadMenu,esi,30
    13.           ; +--------------------------+
    14.           ; | creating the main window |
    15.           ; +--------------------------+
    16.           push ebx esi
    17.           shl esi,9
    18.           invoke    CreateWindowEx,ebx,edi,edi,WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    19.           esi,esi,esi,esi,ebx,eax
    20.           mov ebp,esp
    21.           ; +---------------------------+
    22.           ; | entering the message loop |
    23.           ; +---------------------------+
    24. @@:       invoke    GetMessage,ebp,ebx,ebx,ebx
    25.           invoke    DispatchMessage,ebp
    26.           jmp  @r
    27.           ; +----------------------+
    28.           ; | the window procedure |
    29.           ; +----------------------+
    30.           proc window_procedure,hWnd,uMsg,wParam,lParam
    31.                cmp  [uMsg],WM_COMMAND
    32.                je   wmCOMMAND
    33.                cmp  [uMsg],WM_DESTROY
    34.                je   wmDESTROY
    35.                wmDEFAULT:leave
    36.                     jmp    [DefWindowProc]
    37.                wmCOMMAND:mov eax,[wParam]
    38.                     invoke    MessageBox,[hWnd],[menu_handlers+eax*4],expBoxTitle,ebx;MB_OK
    39.                     leave
    40.                     retn 16
    41.                wmDESTROY:
    42.                     invoke    ExitProcess,ebx;0
    43.           endp
    44.      wTitle         db   'Iczelion Tutorial #8: Создание меню через функцию LoadMenu в FASM',0
    45.      expBoxTitle    db   'Menu Action Description',0
    46.      expBoxDesc11   db   'MenuBar A -> MenuItem A',0
    47.      expBoxDesc12   db   'MenuBar A -> MenuItem B',0
    48.      expBoxDesc13   db   'MenuBar A -> MenuItem C',0
    49.      expBoxDesc21   db   'MenuBar B -> MenuItem A',0
    50.      expBoxDesc30   db   'MenuBar C (Without Item)',0
    51.      menu_handlers dd expBoxDesc11,expBoxDesc12,expBoxDesc13,expBoxDesc21,expBoxDesc30
    52. data import
    53.      library   KERNEL32, 'KERNEL32.DLL',\
    54.                USER32,   'USER32.DLL'
    55.      import    KERNEL32,\
    56.                ExitProcess,        'ExitProcess'
    57.      import    USER32,\
    58.                RegisterClass,      'RegisterClassA',\
    59.                CreateWindowEx,     'CreateWindowExA',\
    60.                DefWindowProc,      'DefWindowProcA',\
    61.                LoadMenu,           'LoadMenuA',\
    62.                GetMessage,         'GetMessageA',\
    63.                MessageBox,         'MessageBoxA',\
    64.                DispatchMessage,    'DispatchMessageA'
    65. end data
    66. align 4
    67. data resource
    68.      directory RT_MENU,appMenu
    69.      resource  appMenu,\
    70.                30,LANG_ENGLISH,menuMain
    71.      menu menuMain
    72.           menuitem  'MenuBar A',10,MFR_POPUP
    73.           menuitem       'MenuBar A -> MenuItem A',0,MFT_STRING
    74.           menuitem       'MenuBar A -> MenuItem B',1,MFT_STRING
    75.                          menuseparator
    76.           menuitem       'MenuBar A -> MenuItem C',2,MFR_END
    77.           menuitem  'MenuBar B',20,MFR_POPUP
    78.           menuitem       'MenuBar B -> MenuItem A',3,MFR_END
    79.           menuitem  'MenuBar C (Without Item)',4,MFR_END
    80. end data
    Результат
    [​IMG]
     

    Вложения:

    • tut_08.png
      tut_08.png
      Размер файла:
      36,1 КБ
      Просмотров:
      3.711
    • tut_08.zip
      Размер файла:
      2 КБ
      Просмотров:
      289
    Последнее редактирование: 15 дек 2016
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 9. Дочерние окна

    исходный текст и ехе-файл здесь
    Код (ASM):
    1.  format PE GUI
    2. include 'win32ax.inc'
    3. ; import, data, code, resource in the same section
    4. ;controller constant
    5. ButtonID        equ 1
    6. EditID          equ 2
    7. IDM_HELLO       equ 0
    8. IDM_CLEAR       equ 1
    9. IDM_GETTEXT     equ 2
    10. IDM_EXIT        equ 3
    11. IDR_MAINMENU    equ 30
    12.           ; +------------------------------+
    13.           ; | registering the window class |
    14.           ; +------------------------------+
    15.           xor ebx,ebx
    16.           mov edi,wTitle
    17.           mov esi,400000h
    18.           invoke    RegisterClass,esp,ebx,WndProc,ebx,\
    19.           ebx,esi,ebx,10005h,COLOR_BTNFACE+1,IDR_MAINMENU,edi
    20.           ; +--------------------------+
    21.           ; | creating the main window |
    22.           ; +--------------------------+
    23.           push ebx esi ebx ebx 200 300
    24.           shl esi,9
    25.           invoke    CreateWindowEx,WS_EX_CLIENTEDGE,edi,edi,\
    26.           WS_OVERLAPPEDWINDOW or WS_VISIBLE,esi,esi
    27.           mov  edi,eax
    28.           invoke    CreateWindowEx,WS_EX_CLIENTEDGE,EditClassName,ebx,\
    29.           WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or ES_AUTOHSCROLL,\
    30.           50,35,200,25,edi,EditID,400000h,ebx
    31.           mov  [hwndEdit],eax
    32.           invoke    SetFocus,eax
    33.           invoke    CreateWindowEx,ebx,ButtonClassName,ButtonText,\
    34.           WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,75,70,140,25,edi,\
    35.           ButtonID,40000h,ebx
    36.           ; +---------------------------+
    37.           ; | entering the message loop |
    38.           ; +---------------------------+
    39.           mov ebp,esp
    40. @@:       invoke    GetMessage,ebp,ebx,ebx,ebx
    41.           invoke    TranslateMessage,ebp
    42.           invoke    DispatchMessage,ebp
    43.           jmp @r
    44.           ; +----------------------+
    45.           ; | the window procedure |
    46.           ; +----------------------+
    47. proc WndProc hWnd,uMsg,wParam,lParam
    48. local buffer[100]:BYTE
    49.                cmp  [uMsg],WM_COMMAND
    50.                je   wmCOMMAND
    51.                cmp  [uMsg],WM_DESTROY
    52.                je   wmDESTROY
    53.                leave
    54.                jmp [DefWindowProc]
    55. wmDESTROY:     invoke ExitProcess,ebx
    56. wmCOMMAND:     movzx eax,word [wParam]
    57.         cmp [lParam],ebx;0
    58.         jnz @f
    59.         mov esi,[hwndEdit]
    60.         jmp dword [menu_handlers+eax*4]
    61. @@:     dec eax         ;cmp ax,ButtonID where ButtonID=1
    62.         jne wmBye
    63.         mov eax,[hWnd]
    64.         push ebx IDM_GETTEXT WM_COMMAND eax
    65.         jmp @f
    66. HELLO:  push  TestString esi    ;hwndEdit
    67.         invoke SetWindowText
    68.         push ebx VK_END WM_KEYDOWN esi  ;hwndEdit
    69. @@:     invoke SendMessage
    70.         jmp wmBye
    71. CLEAR:  push ebx esi    ;hwndEdit
    72.         invoke SetWindowText
    73.         jmp wmBye
    74. GETTEXT:invoke GetWindowText,esi,addr buffer,100
    75.         invoke MessageBox,ebx,addr buffer,MenuName,ebx
    76. wmBye: ret
    77. menu_handlers   dd HELLO, CLEAR, GETTEXT, wmDESTROY
    78.           endp
    79.      wTitle         db   'Iczelion Tutorial #9: Create button and edit field',0 ;name of our window
    80.      MenuName   db "FirstMenu",0
    81. ButtonClassName db "button",0
    82. ButtonText      db "Get Text",0
    83. EditClassName   db "edit",0
    84. TestString      db "Wow! I'm in an edit box now",0
    85. hwndEdit        rd 1
    86. data import
    87.      library   KERNEL32, 'KERNEL32.DLL',\
    88.                USER32,   'USER32.DLL'
    89.      import    KERNEL32,\
    90.                ExitProcess,        'ExitProcess'
    91.      import    USER32,\
    92.                RegisterClass,      'RegisterClassA',\
    93.                CreateWindowEx,     'CreateWindowExA',\
    94.                DefWindowProc,      'DefWindowProcA',\
    95.                SetFocus,           'SetFocus',\
    96.                SetWindowText,      'SetWindowTextA',\
    97.                GetWindowText,      'GetWindowTextA',\
    98.                GetMessage,         'GetMessageA',\
    99.                SendMessage,        'SendMessageA',\
    100.                MessageBox,         'MessageBoxA',\
    101.                TranslateMessage,   'TranslateMessage',\
    102.                DispatchMessage,    'DispatchMessageA'
    103. end data
    104. align 4
    105. data resource
    106.      directory RT_MENU,appMenu
    107.      resource  appMenu,\
    108.                IDR_MAINMENU,LANG_NEUTRAL,menuMain
    109.      menu menuMain
    110.           menuitem  '&Test Controls',10,MFR_POPUP or MFR_END
    111.           menuitem       'Say Hello',IDM_HELLO,MFT_STRING
    112.           menuitem       'Clear Edit Box',IDM_CLEAR,MFT_STRING
    113.           menuitem       'Get Text',IDM_GETTEXT,MFT_STRING
    114.                          menuseparator
    115.           menuitem       'E&xit',IDM_EXIT,MFR_END
    116. end data
    Результат
    [​IMG][​IMG]
     

    Вложения:

    • tut_09a.png
      tut_09a.png
      Размер файла:
      21,3 КБ
      Просмотров:
      3.604
    • tut_09b.png
      tut_09b.png
      Размер файла:
      27,1 КБ
      Просмотров:
      3.628
    • tut_09.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      326
    Последнее редактирование: 15 дек 2016
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 10. Диалоговое окно как основное


    DlgProcDlgProc+WndProcWndProc+Class
    DialogBoxParam
    +10d​
    +10b​
    10c​
    CreateDialogParam
    +10a​
    10e​
    +10f​
    DialogBoxIndirectParam
    CreateDialogIndirectParam

    CreateDialogParam+DlgProc

    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, data, code, resource in the same section
    4. IDM_GETTEXT     equ 0
    5. IDM_CLEAR       equ 1
    6. IDM_EXIT        equ 2
    7. IDC_BUTTON      equ 3
    8. IDC_EXIT        equ 4
    9. IDC_EDIT        equ 5
    10. IDC_MENU        equ 100
    11. IDC_DIALOG      equ 200
    12. size_of_buffer  equ 96
    13.           ; +---------------------------+
    14.           ; | register the window class |
    15.           ; +---------------------------+
    16. start:          xor ebx,ebx
    17.                 invoke CreateDialogParam,400000h,IDC_DIALOG,ebx,DlgProc,ebx
    18.                 sub esp,sizeof.MSG + 4
    19.                 mov edi,esp
    20.                 mov [edi+sizeof.MSG],eax
    21. @@:             invoke GetMessage,edi,ebx,ebx,ebx
    22.                 or eax,eax
    23.                 jz exit_msg_loop
    24.                 invoke IsDialogMessage,dword[edi+sizeof.MSG],edi
    25.                 or eax,eax
    26.                 jnz @r
    27.                 invoke DispatchMessage,edi
    28.                 jmp @r
    29. exit_msg_loop:  add esp,sizeof.MSG+4
    30.                 retn    
    31.           ; +----------------------+
    32.           ; | the dialog procedure |
    33.           ; +----------------------+
    34. proc DlgProc hDlg, uMsg, wParam, lParam
    35. local buffer[size_of_buffer]:BYTE
    36.                 xor ebx,ebx
    37.                 mov edi,[hDlg]
    38.                 lea esi,[buffer]
    39.                 cmp [uMsg],WM_CLOSE
    40.                 je wmCLOSE
    41.                 cmp [uMsg],WM_COMMAND
    42.                 jne a0
    43. wmCOMMAND:      movzx eax,word [wParam]
    44.                 cmp [lParam],ebx
    45.                 jz @f; choose menu
    46. ; choose button or EditBox
    47.                 cmp word[wParam+2],BN_CLICKED
    48.                 jne wmBye
    49. @@:             jmp dword [menu_handlers+eax*4]
    50. GETTEXT: invoke GetDlgItemText,edi,IDC_EDIT,esi,size_of_buffer
    51.                 invoke MessageBox,ebx,esi,AppName,ebx
    52.                 jmp wmBye
    53. SAYHELLO:       push expTxt
    54.                 jmp @f
    55. CLEAR:          push ebx
    56. @@:             invoke SetDlgItemText,edi,IDC_EDIT
    57.                 jmp wmBye
    58. wmCLOSE:        invoke DestroyWindow,edi
    59.                 invoke PostQuitMessage,ebx
    60. a0:             xor eax,eax
    61. wmBye:          ret
    62. menu_handlers   dd  GETTEXT,CLEAR,wmCLOSE,SAYHELLO,wmCLOSE
    63. endp
    64. ;-------------------------------
    65. ;experiment variables
    66.      expTxt      db "Wow! I'm in an edit box now",0
    67.      AppName     db "Our First Dialog Box",0
    68. ;-------------------------------
    69. data import
    70.      library   USER32,   'USER32.DLL'
    71.      import    USER32,\
    72.                    GetMessage,          'GetMessageA',\
    73.                    DispatchMessage,     'DispatchMessageA',\
    74.                    SetDlgItemText,      'SetDlgItemTextA',\
    75.                CreateDialogParam,'CreateDialogParamA',\
    76.                    PostQuitMessage,     'PostQuitMessage',\
    77.                    GetDlgItemText,      'GetDlgItemTextA',\
    78.                IsDialogMessage, 'IsDialogMessageA',\
    79.                DestroyWindow,   'DestroyWindow',\
    80.                MessageBox,              'MessageBoxA'
    81. end data
    82. ;-----------------------------------------------------------------------------
    83. align 4
    84. data resource
    85.      directory RT_MENU,appMenu,\
    86.                RT_DIALOG,appDialog
    87.      resource  appMenu,\
    88.                IDC_MENU,LANG_NEUTRAL,menuMain
    89.      resource   appDialog,\
    90.                IDC_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,main
    91.  
    92.      menu menuMain
    93.           menuitem  '&Test Controls',10,MFR_POPUP or MFR_END
    94.           menuitem       'Get Text',IDM_GETTEXT,MFT_STRING
    95.           menuitem       'Clear Edit Box',IDM_CLEAR,MFT_STRING
    96.                          menuseparator
    97.           menuitem       'E&xit',IDM_EXIT,MFR_END
    98. ;================================================================================
    99. dialog      main,'Iczelion Tutorial #10a: CreateDialogParam+DlgProc',10,10,280,60,\
    100.             0x0004 + DS_CENTER + WS_CAPTION + WS_MINIMIZEBOX + \
    101. WS_SYSMENU + WS_VISIBLE + WS_OVERLAPPED + DS_MODALFRAME + DS_3DLOOK,,IDC_MENU
    102. dialogitem  'EDIT','',IDC_EDIT,15,17,111,13,ES_AUTOHSCROLL + ES_LEFT+ WS_VISIBLE + WS_BORDER + WS_TABSTOP
    103. dialogitem  'BUTTON','Say Hello',IDC_BUTTON,141,10,52,13,BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    104. dialogitem  'BUTTON','E&xit',IDC_EXIT,141,26,52,13,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    105. enddialog
    106. end data
    107.  
    Результат
    [​IMG]

    DialogBoxParam+DlgProc

    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import data code in the same section
    4. IDM_GETTEXT     equ 0
    5. IDM_CLEAR       equ 1
    6. IDM_EXIT        equ 2
    7. IDC_BUTTON      equ 3
    8. IDC_EXIT        equ 4
    9. IDC_EDIT        equ 5
    10. IDC_MENU        equ 100
    11. IDC_DIALOG      equ 200
    12. size_of_buffer  equ 96
    13.           ; +---------------------------+
    14.           ; | register the window class |
    15.           ; +---------------------------+
    16. start:  xor ebx,ebx
    17.                 invoke DialogBoxParam,400000h,IDC_DIALOG,ebx,DlgProc,ebx  
    18.                 retn
    19.           ; +----------------------+
    20.           ; | the dialog procedure |
    21.           ; +----------------------+
    22. proc DlgProc hDlg, uMsg, wParam, lParam
    23. local buffer [size_of_buffer]:BYTE
    24.                 lea esi,[buffer]
    25.                 mov edi,[hDlg]
    26.                 cmp [uMsg],WM_CLOSE
    27.                 jz wmCLOSE
    28.         cmp [uMsg],WM_COMMAND
    29.         jz wmCOMMAND
    30.         xor eax,eax
    31.         ret
    32. wmCOMMAND: movzx eax,word[wParam]
    33.         cmp [lParam],0
    34.         jz  @f; choose menu
    35. ; choose button or EditBox
    36.         cmp word[wParam+2],BN_CLICKED
    37.                 jne  wmBYE
    38. @@:     jmp dword [handlers+eax*4]
    39. GETTEXT: invoke GetDlgItemText,edi,IDC_EDIT,esi,size_of_buffer
    40.                 invoke MessageBox,NULL,esi,AppName,MB_OK
    41.                 jmp  wmBYE
    42. SAYHELLO: push TestString
    43.                 jmp @f
    44. CLEAR: push 0
    45. @@:    invoke SetDlgItemText,edi,IDC_EDIT
    46.         jmp wmBYE
    47. wmCLOSE:invoke EndDialog,edi,0
    48. wmBYE: mov eax,TRUE
    49.         ret
    50. handlers        dd  GETTEXT,CLEAR,wmCLOSE,SAYHELLO,wmCLOSE
    51. endp
    52. ;-------------------------------
    53. ;experiment variables
    54. TestString db "Wow! I'm in an edit box now",0
    55. AppName     db "Our Fourth Dialog Box",0
    56. ;-------------------------------
    57. data import
    58.      library   USER32,   'USER32.DLL'
    59.      import    USER32,\
    60.                         MessageBox,                     'MessageBoxA',\
    61.                         SetDlgItemText,         'SetDlgItemTextA',\
    62.                         DialogBoxParam,         'DialogBoxParamA',\
    63.                         GetDlgItemText,         'GetDlgItemTextA',\      
    64.                         EndDialog,                      'EndDialog'
    65. end data
    66. ;-----------------------------------------------------------------------------
    67. align 4
    68. data resource
    69.      directory RT_MENU,appMenu,\
    70.                RT_DIALOG,appDialog
    71.      resource  appMenu,\
    72.                IDC_MENU,LANG_NEUTRAL,menuMain
    73.      resource   appDialog,\
    74.                IDC_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,main
    75.  
    76.      menu menuMain
    77.           menuitem  '&Test Controls',10,MFR_POPUP or MFR_END
    78.           menuitem       'Get Text',IDM_GETTEXT,MFT_STRING
    79.           menuitem       'Clear Edit Box',IDM_CLEAR,MFT_STRING
    80.                          menuseparator
    81.           menuitem       'E&xit',IDM_EXIT,MFR_END
    82. ;================================================================================
    83. dialog      main,'Iczelion Tutorial #10d: DialogBoxParam+DlgProc',10,10,280,60,\
    84.             0x0004 + DS_CENTER + WS_CAPTION + WS_MINIMIZEBOX + \
    85. WS_SYSMENU + WS_VISIBLE + WS_OVERLAPPED + DS_MODALFRAME + DS_3DLOOK,,IDC_MENU
    86. dialogitem  'EDIT','',IDC_EDIT,15,17,111,13,ES_AUTOHSCROLL + ES_LEFT + WS_VISIBLE + WS_BORDER + WS_TABSTOP
    87. dialogitem  'BUTTON','Say Hello',IDC_BUTTON,141,10,52,13,BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    88. dialogitem  'BUTTON','E&xit',IDC_EXIT,141,26,52,13,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    89. enddialog
    90. end data
    Результат
    [​IMG]

    CreateDialogParam+DlgProc+WndProc


    исходный текст и ехе-файл здесь
    Код (ASM):
    1.  
    2. format PE GUI
    3. include 'win32ax.inc'
    4. ; import data code resource in the same section
    5. IDM_GETTEXT     equ 0
    6. IDM_CLEAR       equ 1
    7. IDM_EXIT        equ 2
    8. IDC_BUTTON      equ 3
    9. IDC_EXIT        equ 4
    10. IDC_EDIT        equ 5
    11. IDC_MENU        equ 100
    12. IDC_DIALOG      equ 200
    13. size_of_buffer  equ 96
    14.           ; +---------------------------+
    15.           ; | register the window class |
    16.           ; +---------------------------+
    17. start:  xor ebx,ebx
    18.                 invoke CreateDialogParam,400000h,IDC_DIALOG,ebx,DlgProc,ebx
    19.                 sub esp,sizeof.MSG+4
    20.         mov edi,esp
    21.                 mov [edi+sizeof.MSG],eax
    22. message_loop: invoke GetMessage,edi,ebx,ebx,ebx
    23.                 or eax,eax
    24.                 jz exit_msg_loop
    25.                 invoke IsDialogMessage,dword[edi+sizeof.MSG],edi
    26.                 or eax,eax
    27.                 jnz message_loop
    28.                 invoke DispatchMessage,edi
    29.         jmp message_loop
    30. exit_msg_loop:add esp,sizeof.MSG+4
    31.                 retn            
     

    Вложения:

    • tut_10d.png
      tut_10d.png
      Размер файла:
      40,8 КБ
      Просмотров:
      3.871
    • tut_10d.zip
      Размер файла:
      2,2 КБ
      Просмотров:
      348
    • tut_10a.png
      tut_10a.png
      Размер файла:
      24,3 КБ
      Просмотров:
      3.856
    • tut_10a.zip
      Размер файла:
      2,4 КБ
      Просмотров:
      395
    Последнее редактирование: 16 дек 2016
  11. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779
    Код (ASM):
    1. proc WndProc hDlg, uMsg, wParam, lParam
    2. local buffer [size_of_buffer]:BYTE
    3.                 lea esi,[buffer]
    4.                 mov edi,[hDlg]
    5.                 cmp [uMsg],WM_CLOSE
    6.                 jz wmCLOSE
    7.                 cmp [uMsg],WM_COMMAND
    8.                 jz wmCOMMAND
    9.                 leave
    10.                 jmp [DefDlgProc]
    11. wmCOMMAND:      movzx eax,word[wParam]
    12.                 cmp [lParam],0
    13.                 jz  @f; choose menu
    14. ; choose button or EditBox
    15.                 cmp word[wParam+2],BN_CLICKED
    16.                 jne  wmBYE
    17. @@:             jmp dword [handlers+eax*4]
    18. GETTEXT:        invoke GetDlgItemText,edi,IDC_EDIT,esi,size_of_buffer
    19.                 invoke MessageBox,NULL,esi,AppName,MB_OK
    20.                 jmp  wmBYE
    21. SAYHELLO:       push TestString
    22.                 jmp @f
    23. CLEAR:          push 0
    24. @@:             invoke SetDlgItemText,edi,IDC_EDIT
    25.                 jmp wmBYE
    26. wmCLOSE:        invoke DestroyWindow,edi
    27.                 invoke PostQuitMessage,NULL
    28. wmBYE:          ret
    29. handlers        dd  GETTEXT,CLEAR,wmCLOSE,SAYHELLO,wmCLOSE
    30. endp
    31. DlgProc:        cmp dword [esp+8],WM_INITDIALOG; cmp [uMsg],WM_INITDIALOG
    32.                 jne @f
    33.                 invoke SetWindowLong,dword [esp+4+8],GWL_WNDPROC,WndProc
    34. @@:             xor eax,eax
    35.                 retn 10h
    36. ;experiment variables
    37. TestString db "Wow! I'm in an edit box now",0
    38. AppName     db "Our Second Dialog Box",0
    39. data import
    40.      library   USER32,   'USER32.DLL'
    41.      import    USER32,\
    42.                         DispatchMessage,        'DispatchMessageA',\
    43.                         GetMessage,                     'GetMessageA',\
    44.                         PostQuitMessage,        'PostQuitMessage',\
    45.                         MessageBox,                     'MessageBoxA',\
    46.                         IsDialogMessage,        'IsDialogMessageA',\        
    47.                         SetDlgItemText,         'SetDlgItemTextA',\
    48.                         CreateDialogParam,      'CreateDialogParamA',\
    49.                         GetDlgItemText,         'GetDlgItemTextA',\
    50.                         SetWindowLong,          'SetWindowLongA',\
    51.                         DefDlgProc,                     'DefDlgProcA',\
    52.                         DestroyWindow,          'DestroyWindow'
    53. end data
    54. align 4
    55. data resource
    56.      directory RT_MENU,appMenu,\
    57.                RT_DIALOG,appDialog
    58.      resource  appMenu,\
    59.                IDC_MENU,LANG_NEUTRAL,menuMain
    60.      resource   appDialog,\
    61.                IDC_DIALOG,LANG_ENGLISH+SUBLANG_DEFAULT,main
    62.    
    63.      menu menuMain
    64.           menuitem  '&Test Controls',10,MFR_POPUP or MFR_END
    65.           menuitem       'Get Text',IDM_GETTEXT,MFT_STRING
    66.           menuitem       'Clear Edit Box',IDM_CLEAR,MFT_STRING
    67.                          menuseparator
    68.           menuitem       'E&xit',IDM_EXIT,MFR_END
    69.  
    70. dialog      main,'Iczelion Tutorial #10b: CreateDialogParam+DlgProc+WndProc',10,10,280,60,\
    71.             0x0004 + DS_CENTER + WS_CAPTION + WS_MINIMIZEBOX + \
    72. WS_SYSMENU + WS_VISIBLE + WS_OVERLAPPED + DS_MODALFRAME + DS_3DLOOK,,IDC_MENU
    73. dialogitem  'EDIT','',IDC_EDIT,15,17,111,13,ES_AUTOHSCROLL + ES_LEFT+ WS_VISIBLE + WS_BORDER + WS_TABSTOP
    74. dialogitem  'BUTTON','Say Hello',IDC_BUTTON,141,10,52,13,BS_DEFPUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    75. dialogitem  'BUTTON','E&xit',IDC_EXIT,141,26,52,13,BS_PUSHBUTTON + WS_VISIBLE + WS_TABSTOP
    76. enddialog
    77. end data
    Результат
    [​IMG]

    CreateDialogParam+WndProc+Class

    исходный текст и ехе-файл здесь
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import data code in the same section
    4. IDM_GETTEXT equ 0
    5. IDM_CLEAR equ 1
    6. IDM_EXIT equ 2
    7. IDC_BUTTON equ 3
    8. IDC_EXIT equ 4
    9. IDC_EDIT equ 5
    10. IDC_MENU equ 100
    11. IDC_DIALOG equ 200
    12. size_of_buffer equ 96
    13.  ; +---------------------------+
    14.  ; | register the window class |
    15.  ; +---------------------------+
    16. start: xor ebx,ebx
    17. mov esi,400000h
    18. invoke RegisterClassEx,esp,sizeof.WNDCLASSEX,CS_HREDRAW or CS_VREDRAW,WndProc,\
    19. ebx,DLGWINDOWEXTRA,esi,ebx,10005h,COLOR_BTNFACE+1,IDC_MENU,ClassName,ebx
    20. invoke CreateDialogParam,esi,IDC_DIALOG,ebx,ebx,ebx
    21. mov edi,esp
    22. mov [edi+sizeof.MSG],eax
    23. @@: invoke GetMessage,edi,ebx,ebx,ebx
    24. or eax,eax
    25. jz exit_msg_loop
    26. invoke IsDialogMessage,dword[edi+sizeof.MSG],edi
    27. or eax,eax
    28. jnz @r
    29. invoke DispatchMessage,edi
    30. jmp @r
    31. exit_msg_loop:invoke ExitProcess,0
    32.  ; +----------------------+
    33.  ; | the dialog procedure |
    34.  ; +----------------------+
    35. proc WndProc hDlg, uMsg, wParam, lParam
    36. local buffer [size_of_buffer]:BYTE
    37. lea esi,[buffer]
    38. mov edi,[hDlg]
    39. cmp [uMsg],WM_CLOSE
    40. jz wmCLOSE
    41. cmp [uMsg],WM_COMMAND
    42. jz wmCOMMAND
    43. leave
    44. jmp [DefDlgProc]
    45. wmCOMMAND:movzx eax,word[wParam]
    46. cmp [lParam],0
    47. jz @f; choose menu
    48. ; choose button or EditBox
    49. cmp word[wParam+2],BN_CLICKED
    50. jne wmBYE
    51. @@: jmp dword [handlers+eax*4]
    52. GETTEXT:invoke GetDlgItemText,edi,IDC_EDIT,esi,size_of_buffer
    53. invoke MessageBox,NULL,esi,AppName,MB_OK
    54. jmp wmBYE
    55. SAYHELLO:push TestString
    56. jmp @f
    57. CLEAR: push 0
    58. @@: invoke SetDlgItemText,edi,IDC_EDIT
    59. jmp wmBYE
    60. wmCLOSE:invoke DestroyWindow,edi
    61. invoke PostQuitMessage,0
    62. wmBYE: ret
    63. handlers dd GETTEXT,CLEAR,wmCLOSE,SAYHELLO,wmCLOSE
    64. endp
    65. ;-------------------------------
    66. ;experiment variables
    67. TestString db "Wow! I'm in an edit box now",0
    68. AppName    db "Our Third Dialog Box",0
    69. ClassName  db 'DLGCLASS',0
    70. ;-------------------------------
    71. data import
    72.      library   USER32, 'USER32.DLL',\
    73.       kernel32, 'kernel32.dll'
    74.      import    USER32,\
    75. DispatchMessage, 'DispatchMessageA',\
    76. GetMessage, 'GetMessageA',\
    77. PostQuitMessage, 'PostQuitMessage',\
    78. MessageBox, 'MessageBoxA',\
    79. IsDialogMessage, 'IsDialogMessageA',\
    80. SetDlgItemText, 'SetDlgItemTextA',\
    81. CreateDialogParam, 'CreateDialogParamA',\
    82. GetDlgItemText, 'GetDlgItemTextA',\
    83. RegisterClassEx, 'RegisterClassExA',\
    84. DefDlgProc, 'DefDlgProcA',\
    85. DestroyWindow, 'DestroyWindow'
    86.       import kernel32,\
    87. ExitProcess, 'ExitProcess'
    88. end data
    89. section '.rsrc' resource from 'tut_10c.res' data readable
    tut_10c.rc
    Код (ASM):
    1.  
    2. #include "resource.h"
    3. #define IDM_GETTEXT     0
    4. #define IDM_CLEAR     1
    5. #define IDM_EXIT     2
    6. #define IDC_BUTTON     3
    7. #define IDC_EXIT     4
    8. #define IDC_EDIT     5
    9. #define IDC_MENU 100
    10. #define IDC_DIALOG 200
    11. IDC_DIALOG DIALOGEX 10, 10, 230, 60
    12. STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX |
    13. WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
    14. CAPTION "Iczelion Tutorial #10c: CreateDialogParam+WndProc+Class"
    15. CLASS "DLGCLASS"
    16. BEGIN
    17.     EDITTEXT IDC_EDIT,   15,17,111,13, ES_AUTOHSCROLL | ES_LEFT |WS_TABSTOP
    18.     DEFPUSHBUTTON   "Say Hello", IDC_BUTTON,141,10,52, 13,WS_TABSTOP
    19.     PUSHBUTTON    "E&xit", IDC_EXIT,  141,26,52, 13,WS_TABSTOP
    20. END
    21. IDC_MENU  MENU
    22. BEGIN
    23.     POPUP "Test Controls"
    24.     BEGIN
    25. MENUITEM "Get Text", IDM_GETTEXT
    26. MENUITEM "Clear Text", IDM_CLEAR
    27. MENUITEM SEPARATOR
    28. MENUITEM "E&xit", IDM_EXIT
    29.     END
    30. END
    Результат
    [​IMG]
     

    Вложения:

    • tut_11a.gif
      tut_11a.gif
      Размер файла:
      2,7 КБ
      Просмотров:
      603
    • tut_11b.gif
      tut_11b.gif
      Размер файла:
      2,6 КБ
      Просмотров:
      596
    • tut_10b.png
      tut_10b.png
      Размер файла:
      27,7 КБ
      Просмотров:
      3.657
    • tut_10b.zip
      Размер файла:
      2,6 КБ
      Просмотров:
      178
    • tut_10c.zip
      Размер файла:
      3,2 КБ
      Просмотров:
      359
    • 10с.png
      10с.png
      Размер файла:
      19 КБ
      Просмотров:
      3.516
    • upload_2016-12-17_18-5-12.png
      upload_2016-12-17_18-5-12.png
      Размер файла:
      22,1 КБ
      Просмотров:
      592
    Последнее редактирование: 17 дек 2016
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 12. Память и файлы


    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. MI_OPEN   equ  110
    7. MI_SAVE   equ  120
    8. MI_EXIT   equ  190
    9.  
    10. MEM_SIZE  equ  65535
    11.  
    12. EDIT_ID   equ  1
    13.  
    14. section '.data' data readable writeable
    15.      hMain          dd   ?
    16.      hInstance      dd   ?
    17.  
    18.      wTitle         db   'Tutorial 12',0
    19.      wClsName       db   'TUT12',0
    20.  
    21.      wMsg      MSG
    22.      wCls      WNDCLASS
    23.      hEdit          dd   ?    ;handle for edit control
    24.      CLSNAME_EDIT   db   'edit',0
    25.  
    26.      dOpenTitle     db   'Open File',0
    27.      dOpenFilter    db   'All Files (*.*)',0,'*.*',0,0
    28.      dOpenOfn       OPENFILENAME
    29.      dOpenBuffer:   times 260 db 0
    30.  
    31.      hFile          dd   ?    ;handle to file
    32.      hMem           dd   ?    ;handle to the allocated memory block
    33.      pMem           dd   ?    ;pointer to the allocated memory block
    34.  
    35.      szReadWrite    dd   ?    ;number of bytes actually read or write
    36.  
    37. section '.code' code readable executable
    38.      start:
    39.           ; +------------------------------+
    40.           ; | registering the window class |
    41.           ; +------------------------------+
    42.           invoke    GetModuleHandle,NULL
    43.                     mov  [hInstance],eax
    44.                     mov  [wCls.hInstance],eax
    45.                     mov  [wCls.style],CS_HREDRAW or CS_VREDRAW
    46.                     mov  [wCls.lpfnWndProc],window_procedure
    47.                     mov  [wCls.lpszClassName],wClsName
    48.                     mov  [wCls.lpszMenuName],30
    49.                     mov  [wCls.hbrBackground],COLOR_WINDOW+1
    50.           invoke    LoadIcon,NULL,IDI_APPLICATION
    51.                     mov  [wCls.hIcon],eax
    52.           invoke    LoadCursor,NULL,IDC_ARROW
    53.                     mov  [wCls.hCursor],eax
    54.           invoke    RegisterClass,wCls
    55.  
    56.           ; +--------------------------+
    57.           ; | creating the main window |
    58.           ; +--------------------------+
    59.           invoke    CreateWindowEx,\
    60.                          WS_EX_CLIENTEDGE,\
    61.                          wClsName,\
    62.                          wTitle,\
    63.                          WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    64.                          CW_USEDEFAULT,\
    65.                          CW_USEDEFAULT,\
    66.                          300,\
    67.                          200,\
    68.                          NULL,\
    69.                          NULL,\
    70.                          [hInstance],\
    71.                          NULL
    72.                     mov  [hMain],eax
    73.  
    74.           ; +---------------------------+
    75.           ; | entering the message loop |
    76.           ; +---------------------------+
    77.           window_message_loop_start:
    78.                invoke    GetMessage,wMsg,NULL,0,0
    79.                          or   eax,eax
    80.                          je   window_message_loop_end
    81.                invoke    TranslateMessage,wMsg
    82.                invoke    DispatchMessage,wMsg
    83.                          jmp  window_message_loop_start
    84.  
    85.           window_message_loop_end:
    86.                invoke    ExitProcess,0
    87.  
    88.           ; +----------------------+
    89.           ; | the window procedure |
    90.           ; +----------------------+
    91.           proc window_procedure,hWnd,uMsg,wParam,lParam
    92.                push ebx esi edi
    93.                cmp  [uMsg],WM_CREATE
    94.                je   wmCREATE
    95.                cmp  [uMsg],WM_SIZE
    96.                je   wmSIZE
    97.                cmp  [uMsg],WM_COMMAND
    98.                je   wmCOMMAND
    99.                cmp  [uMsg],WM_DESTROY
    100.                je   wmDESTROY
    101.  
    102.                wmDEFAULT:
    103.                     invoke    DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    104.                               jmp  wmBYE
    105.                wmSIZE:
    106.                               mov  eax,[lParam]
    107.                               mov  edx,eax
    108.                               shr  edx,16
    109.                               and  eax,0xFFFF
    110.                     invoke    MoveWindow,[hEdit],0,0,eax,edx,TRUE
    111.                               jmp  wmBYE
    112.                wmCREATE:
    113.                     invoke    CreateWindowEx,\
    114.                                    NULL,\
    115.                                    CLSNAME_EDIT,\
    116.                                    NULL,\
    117.                                    WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or WS_VSCROLL or WS_HSCROLL or\
    118.                                    ES_AUTOHSCROLL or ES_AUTOVSCROLL,\
    119.                                    0,0,0,0,\
    120.                                    [hWnd],\
    121.                                    EDIT_ID,\
    122.                                    [hInstance],\
    123.                                    NULL
    124.                               mov  [hEdit],eax
    125.                     invoke    SetFocus,eax
    126.                               mov  [dOpenOfn.lStructSize],sizeof.OPENFILENAME
    127.                               push hInstance
    128.                               pop  [dOpenOfn.hInstance]
    129.                               mov  [dOpenOfn.lpstrFilter],dOpenFilter
    130.                               mov  [dOpenOfn.lpstrFile],dOpenBuffer
    131.                               mov  [dOpenOfn.nMaxFile],260
    132.                               jmp  wmBYE
    133.                wmCOMMAND:
    134.                     cmp  [wParam],0xFFFF and MI_OPEN
    135.                     je   wmCOMMAND_MI_OPEN
    136.                     cmp  [wParam],0xFFFF and MI_SAVE
    137.                     je   wmCOMMAND_MI_SAVE
    138.                     cmp  [wParam],0xFFFF and MI_EXIT
    139.                     je   wmCOMMAND_MI_EXIT
    140.                     jmp  wmBYE
    141.  
    142.                     wmCOMMAND_MI_EXIT:
    143.                          invoke    DestroyWindow,[hWnd]
    144.                                    jmp  wmBYE
    145.  
    146.                     wmCOMMAND_COMMAND_EXIT_POINT:
    147.                          invoke    SetFocus,[hEdit]
    148.                                    jmp  wmBYE
    149.  
    150.                     wmCOMMAND_MI_OPEN:
    151.                                    mov  [dOpenOfn.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or\
    152.                                         OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    153.                          invoke    GetOpenFileName,dOpenOfn
    154.                                    cmp  eax,TRUE
    155.                                    je   wmCOMMAND_MI_OPEN_TRUE
    156.                                    jmp  wmCOMMAND_COMMAND_EXIT_POINT
    157.  
    158.                     wmCOMMAND_MI_OPEN_TRUE:
    159.                          invoke    CreateFile,\
    160.                                         dOpenBuffer,\
    161.                                         GENERIC_READ or GENERIC_WRITE,\
    162.                                         FILE_SHARE_READ or FILE_SHARE_WRITE,\
    163.                                         NULL,\
    164.                                         OPEN_EXISTING,\
    165.                                         FILE_ATTRIBUTE_ARCHIVE,\
    166.                                         NULL
    167.                                    mov  [hFile],eax
    168.                          invoke    GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEM_SIZE
    169.                                    mov  [hMem],eax
    170.                          invoke    GlobalLock,eax
    171.                                    mov  [pMem],eax
    172.                          invoke    ReadFile,[hFile],[pMem],MEM_SIZE-1,szReadWrite,NULL
    173.                          invoke    SendMessage,[hEdit],WM_SETTEXT,NULL,[pMem]
    174.                          invoke    CloseHandle,[hFile]
    175.                          invoke    GlobalUnlock,[pMem]
    176.                          invoke    GlobalFree,[hMem]
    177.                                    jmp  wmCOMMAND_COMMAND_EXIT_POINT
    178.  
    179.                     wmCOMMAND_MI_SAVE:
    180.                                    mov  [dOpenOfn.Flags],OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    181.                          invoke    GetSaveFileName,dOpenOfn
    182.                                    cmp  eax,TRUE
    183.                                    je   wmCOMMAND_MI_SAVE_TRUE
    184.                                    jmp  wmCOMMAND_COMMAND_EXIT_POINT
    185.  
    186.                     wmCOMMAND_MI_SAVE_TRUE:
    187.                          invoke    CreateFile,\
    188.                                         dOpenBuffer,\
    189.                                         GENERIC_READ or GENERIC_WRITE,\
    190.                                         FILE_SHARE_READ or FILE_SHARE_WRITE,\
    191.                                         NULL,\
    192.                                         CREATE_NEW,\
    193.                                         FILE_ATTRIBUTE_ARCHIVE,\
    194.                                         NULL
    195.                                    mov  [hFile],eax
    196.                          invoke    GlobalAlloc,GMEM_MOVEABLE or GMEM_ZEROINIT,MEM_SIZE
    197.                                    mov  [hMem],eax
    198.                          invoke    GlobalLock,eax
    199.                                    mov  [pMem],eax
    200.                          invoke    SendMessage,[hEdit],WM_GETTEXT,MEM_SIZE-1,[pMem]
    201.                          invoke    WriteFile,[hFile],[pMem],eax,szReadWrite,NULL
    202.                          invoke    CloseHandle,[hFile]
    203.                          invoke    GlobalUnlock,[pMem]
    204.                          invoke    GlobalFree,[hMem]
    205.                                    jmp  wmCOMMAND_COMMAND_EXIT_POINT
    206.  
    207.                wmDESTROY:
    208.                     invoke    PostQuitMessage,0
    209.                wmBYE:
    210.                     pop  edi esi ebx
    211.                     return
    212.           endp
    Продолжение ниже
     

    Вложения:

    • tut_12.gif
      tut_12.gif
      Размер файла:
      7,7 КБ
      Просмотров:
      3.735
  13. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779
    Код (ASM):
    1. section '.idata' import data readable writeable
    2.      library   KERNEL32, 'KERNEL32.DLL',\
    3.                USER32,   'USER32.DLL',\
    4.                COMDLG32, 'COMDLG32.DLL'
    5.  
    6.      import    KERNEL32,\
    7.                GetModuleHandle,    'GetModuleHandleA',\
    8.                lstrcat,            'lstrcat',\
    9.                RtlZeroMemory,      'RtlZeroMemory',\
    10.                CreateFile,         'CreateFileA',\
    11.                GlobalAlloc,        'GlobalAlloc',\
    12.                GlobalFree,         'GlobalFree',\
    13.                GlobalLock,         'GlobalLock',\
    14.                GlobalUnlock,       'GlobalUnlock',\
    15.                ReadFile,           'ReadFile',\
    16.                WriteFile,          'WriteFile',\
    17.                CloseHandle,        'CloseHandle',\
    18.                ExitProcess,        'ExitProcess'
    19.  
    20.      import    USER32,\
    21.                RegisterClass,      'RegisterClassA',\
    22.                CreateWindowEx,     'CreateWindowExA',\
    23.                DefWindowProc,      'DefWindowProcA',\
    24.                LoadCursor,         'LoadCursorA',\
    25.                LoadIcon,           'LoadIconA',\
    26.                MessageBox,         'MessageBoxA',\
    27.                SendMessage,        'SendMessageA',\
    28.                SetFocus,           'SetFocus',\
    29.                GetMessage,         'GetMessageA',\
    30.                MoveWindow,         'MoveWindow',\
    31.                DestroyWindow,      'DestroyWindow',\
    32.                TranslateMessage,   'TranslateMessage',\
    33.                DispatchMessage,    'DispatchMessageA',\
    34.                PostQuitMessage,    'PostQuitMessage'
    35.      import    COMDLG32,\
    36.                GetOpenFileName,    'GetOpenFileNameA',\
    37.                GetSaveFileName,    'GetSaveFileNameA'
    38.  
    39. section '.rsrc' resource data readable
    40.      directory RT_MENU,appMenu
    41.  
    42.      resource  appMenu,\
    43.                30,LANG_NEUTRAL,menuMain
    44.  
    45.      menu menuMain
    46.           menuitem  '&File',0,MFR_POPUP + MFR_END
    47.           menuitem       'Op&en',MI_OPEN,0
    48.           menuitem       '&Save',MI_SAVE,0
    49.                          menuseparator
    50.           menuitem       'E&xit',MI_EXIT,MFR_END
    51.  
    Результат
    [​IMG]
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 13. Memory Mapped файлы


    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. ; +-----------------------+
    7. ; | menu item declaration |
    8. ; +-----------------------+
    9. MI_OPEN equ     110
    10. MI_SAVE equ     120
    11. MI_EXIT equ     190
    12.  
    13. section '.data' data readable writeable
    14.         sTitle          db      'Tutorial 13',0
    15.         sClsName        db      'TUT13',0
    16.  
    17.         hWindow         dd      ?
    18.         hInstance       dd      ?
    19.         msg             MSG
    20.         wc              WNDCLASS
    21.  
    22.         dOTitle         db      'Open File',0
    23.         dOFilter        db      'All Files (*.*)',0,'*.*',0,0
    24.         dOBuffer:       times 260 db 0
    25.         dOOfn           OPENFILENAME
    26.  
    27.         hFileR          dd      ?       ;file read handle
    28.         hFileW          dd      ?       ;file write handle
    29.         hFileM          dd      ?       ;file mapped handle
    30.         pFileM          dd      ?       ;pointer for the starting address of mapped file
    31.  
    32.         hMenu           dd      ?       ;menu handle
    33.  
    34.         szFileWritten   dd      ?       ;size number of bytes written
    35.  
    36. section '.code' code readable executable
    37.         start:
    38.                 ; +------------------------------+
    39.                 ; | registering the window class |
    40.                 ; +------------------------------+
    41.                 invoke  GetModuleHandle,NULL
    42.                         mov     [hInstance],eax
    43.                         mov     [wc.hInstance],eax
    44.                         mov     [wc.style],CS_HREDRAW or CS_VREDRAW
    45.                         mov     [wc.lpfnWndProc],window_procedure
    46.                         mov     [wc.lpszClassName],sClsName
    47.                         mov     [wc.lpszMenuName],30
    48.                         mov     [wc.hbrBackground],COLOR_WINDOW+1
    49.                 invoke  LoadIcon,NULL,IDI_APPLICATION
    50.                         mov     [wc.hIcon],eax
    51.                 invoke  LoadCursor,NULL,IDC_ARROW
    52.                         mov  [wc.hCursor],eax
    53.                 invoke  RegisterClass,wc
    54.  
    55.                 ; +--------------------------+
    56.                 ; | creating the main window |
    57.                 ; +--------------------------+
    58.                 invoke  CreateWindowEx,\
    59.                         WS_EX_CLIENTEDGE,\
    60.                         sClsName,\
    61.                         sTitle,\
    62.                         WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    63.                         CW_USEDEFAULT,\
    64.                         CW_USEDEFAULT,\
    65.                         300,\
    66.                         200,\
    67.                         NULL,\
    68.                         NULL,\
    69.                         [hInstance],\
    70.                         NULL
    71.                         mov     [hWindow],eax
    72.  
    73.                 ; +---------------------------+
    74.                 ; | entering the message loop |
    75.                 ; +---------------------------+
    76.                 window_message_loop_start:
    77.                         invoke  GetMessage,msg,NULL,0,0
    78.                                 or      eax,eax
    79.                                 je      window_message_loop_end
    80.                         invoke  TranslateMessage,msg
    81.                         invoke  DispatchMessage,msg
    82.                                 jmp  window_message_loop_start
    83.  
    84.                 window_message_loop_end:
    85.                         invoke  ExitProcess,0
    86.  
    87.                 ; +----------------------+
    88.                 ; | the window procedure |
    89.                 ; +----------------------+
    90.                 proc window_procedure,hWnd,uMsg,wParam,lParam
    91.                         push    ebx esi edi
    92.                         cmp     [uMsg],WM_CREATE
    93.                         je      wmCREATE
    94.                         cmp     [uMsg],WM_COMMAND
    95.                         je      wmCOMMAND
    96.                         cmp     [uMsg],WM_DESTROY
    97.                         je      wmDESTROY
    98.  
    99.                         wmDEFAULT:
    100.                                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    101.                                         jmp  wmBYE
    102.  
    103.                         wmCREATE:
    104.                                 invoke  GetMenu,[hWnd]
    105.                                         mov     [hMenu],eax
    106.                                         mov     [dOOfn.lStructSize],sizeof.OPENFILENAME
    107.                                         push    hInstance
    108.                                         pop     [dOOfn.hInstance]
    109.                                         mov     [dOOfn.lpstrFilter],dOFilter
    110.                                         mov     [dOOfn.lpstrFile],dOBuffer
    111.                                         mov     [dOOfn.nMaxFile],260
    112.                                         jmp     wmBYE
    113.                         wmCOMMAND:
    114.                                 cmp     [wParam],0xFFFF and MI_OPEN
    115.                                 je      wmCOMMAND_MI_OPEN
    116.                                 cmp     [wParam],0xFFFF and MI_SAVE
    117.                                 je      wmCOMMAND_MI_SAVE
    118.                                 cmp     [wParam],0xFFFF and MI_EXIT
    119.                                 je      wmCOMMAND_MI_EXIT
    120.                                 jmp     wmBYE
    121.  
    122.                                 wmCOMMAND_MI_EXIT:
    123.                                         invoke  DestroyWindow,[hWnd]
    124.                                                 jmp     wmBYE
    125.  
    126.                                 wmCOMMAND_MI_OPEN:
    127.                                                 mov     [dOOfn.Flags],OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or\
    128.                                                         OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    129.                                         invoke  GetOpenFileName,dOOfn
    130.                                                 cmp     eax,TRUE
    131.                                                 je      wmCOMMAND_MI_OPEN_TRUE
    132.                                                 jmp     wmBYE
    133.  
    134.                                 wmCOMMAND_MI_OPEN_TRUE:
    135.                                         invoke  CreateFile,\
    136.                                                         dOBuffer,\
    137.                                                         GENERIC_READ,\
    138.                                                         0,\
    139.                                                         NULL,\
    140.                                                         OPEN_EXISTING,\
    141.                                                         FILE_ATTRIBUTE_ARCHIVE,\
    142.                                                         NULL
    143.                                                 mov     [hFileR],eax
    144.                                         invoke  CreateFileMapping,\
    145.                                                         eax,\
    146.                                                         NULL,\
    147.                                                         PAGE_READONLY,\
    148.                                                         0,0,NULL
    149.                                                 mov     [hFileM],eax
    150.                                                 mov     eax,dOBuffer
    151.                                                 movsx   edx,[dOOfn.nFileOffset]
    152.                                                 add     eax,edx
    153.                                         invoke  SetWindowText,[hWnd],eax
    154.                                         invoke  EnableMenuItem,[hMenu],MI_OPEN,MF_GRAYED
    155.                                         invoke  EnableMenuItem,[hMenu],MI_SAVE,MF_ENABLED
    156.                                                 jmp     wmBYE
    157.  
    158.                                 wmCOMMAND_MI_SAVE:
    159.                                                 mov     [dOOfn.Flags],OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    160.                                         invoke  GetSaveFileName,dOOfn
    161.                                                 cmp     eax,TRUE
    162.                                                 je      wmCOMMAND_MI_SAVE_TRUE
    163.                                                 jmp     wmBYE
    164.  
    165.                                 wmCOMMAND_MI_SAVE_TRUE:
    166.                                         invoke  CreateFile,\
    167.                                                         dOBuffer,\
    168.                                                         GENERIC_READ or GENERIC_WRITE,\
    169.                                                         FILE_SHARE_READ or FILE_SHARE_WRITE,\
    170.                                                         NULL,\
    171.                                                         CREATE_NEW,\
    172.                                                         FILE_ATTRIBUTE_ARCHIVE,\
    173.                                                         NULL
    174.                                                 mov     [hFileW],eax
    175.                                         invoke  MapViewOfFile,[hFileM],FILE_MAP_READ,0,0,0
    176.                                                 mov     [pFileM],eax
    177.                                         invoke  GetFileSize,[hFileR],NULL
    178.                                         invoke  WriteFile,[hFileW],[pFileM],eax,szFileWritten,NULL
    179.                                         invoke  UnmapViewOfFile,[pFileM]
    180.                                         invoke  CloseHandle,[hFileM]
    181.                                         invoke  CloseHandle,[hFileR]
    182.                                         invoke  CloseHandle,[hFileW]
    183.                                         invoke  SetWindowText,[hWnd],sTitle
    184.                                         invoke  EnableMenuItem,[hMenu],MI_OPEN,MF_ENABLED
    185.                                         invoke  EnableMenuItem,[hMenu],MI_SAVE,MF_GRAYED
    186.                                                 jmp     wmBYE
    187.  
    188.                         wmDESTROY:
    189.                                 invoke  PostQuitMessage,0
    190.  
    191.                         wmBYE:
    192.                                 pop  edi esi ebx
    193.                                 return
    194.                 endp
    Продолжение ниже
     

    Вложения:

    • tut_13.gif
      tut_13.gif
      Размер файла:
      2,8 КБ
      Просмотров:
      3.717
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779
    Код (ASM):
    1. section '.idata' import data readable writeable
    2.         library KERNEL32,       'KERNEL32.DLL',\
    3.                         USER32, 'USER32.DLL',\
    4.                         COMDLG32,       'COMDLG32.DLL'
    5.  
    6.         import  KERNEL32,\
    7.                         GetModuleHandle,        'GetModuleHandleA',\
    8.                         lstrcat,                'lstrcat',\
    9.                         CreateFileMapping,      'CreateFileMappingA',\
    10.                         MapViewOfFile,          'MapViewOfFile',\
    11.                         UnmapViewOfFile,        'UnmapViewOfFile',\
    12.                         GetFileSize,            'GetFileSize',\
    13.                         CreateFile,             'CreateFileA',\
    14.                         WriteFile,              'WriteFile',\
    15.                         CloseHandle,            'CloseHandle',\
    16.                         ExitProcess,            'ExitProcess'
    17.  
    18.         import  USER32,\
    19.                         RegisterClass,          'RegisterClassA',\
    20.                         CreateWindowEx,         'CreateWindowExA',\
    21.                         DefWindowProc,          'DefWindowProcA',\
    22.                         LoadCursor,             'LoadCursorA',\
    23.                         LoadIcon,               'LoadIconA',\
    24.                         SetWindowText,          'SetWindowTextA',\
    25.                         GetMenu,                'GetMenu',\
    26.                         EnableMenuItem,         'EnableMenuItem',\
    27.                         GetMessage,             'GetMessageA',\
    28.                         DestroyWindow,          'DestroyWindow',\
    29.                         TranslateMessage,       'TranslateMessage',\
    30.                         DispatchMessage,        'DispatchMessageA',\
    31.                         PostQuitMessage,        'PostQuitMessage'
    32.  
    33.         import  COMDLG32,\
    34.                         GetOpenFileName,        'GetOpenFileNameA',\
    35.                         GetSaveFileName,        'GetSaveFileNameA'
    36.  
    37. section '.rsrc' resource data readable
    38.         directory       RT_MENU,appMenu
    39.  
    40.         resource        appMenu,\
    41.                         30,LANG_NEUTRAL,menuMain
    42.  
    43.         menu    menuMain
    44.                 menuitem        '&File',0,MFR_POPUP + MFR_END
    45.                 menuitem                'Op&en',MI_OPEN,0
    46.                 menuitem                '&Save',MI_SAVE,0,MF_GRAYED
    47.                                         menuseparator
    48.                 menuitem                'E&xit',MI_EXIT,MFR_END
    49.  
    Результат
    [​IMG]
     
  16. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 14. Процесс


    Пожалуйста, сначала соберите следующую программу под именем tut_14a.exe
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7.         mbCaption       db      'Message Box Title',0
    8.         mbText          db      'Win32 Assembly with FASM is Great',0
    9.  
    10. section '.code' code readable executable
    11.         start:
    12.                         push    MB_OK
    13.                         push    mbCaption
    14.                         push    mbText
    15.                         push    dword NULL
    16.                         call    [MessageBox]
    17.                 invoke  ExitProcess,0
    18.  
    19. section '.idata' import data readable writeable
    20.         library KERNEL32,       'KERNEL32.DLL',\
    21.                 USER32,         'USER32.DLL'
    22.  
    23.         import  KERNEL32,\
    24.                 ExitProcess,    'ExitProcess'
    25.  
    26.         import  USER32,\
    27.                 MessageBox,     'MessageBoxA'
    28.  
    Результат
    [​IMG]

    Тогда следующая программа будет использовать tut_14a.exe
    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. ; +-----------------------+
    7. ; | menu item declaration |
    8. ; +-----------------------+
    9. MI_PROCESS_CREATE       equ     110
    10. MI_PROCESS_TERMINATE    equ     120
    11. MI_EXIT                 equ     190
    12.  
    13. section '.data' data readable writeable
    14.         sTitle          db      'Tutorial 14',0
    15.         sClsName        db      'TUT14',0
    16.  
    17.         hWindow         dd      ?
    18.         hInstance       dd      ?
    19.         msg             MSG
    20.         wc              WNDCLASS
    21.  
    22.         hMenu           dd      ?       ;menu handle
    23.  
    24.         proExitCode     dd      ?       ;process exit code
    25.  
    26.         progName        db      'tut_14a.exe',0
    27.         progStartInfo   STARTUPINFO
    28.  
    29.         pi              PROCESS_INFORMATION
    30.  
    31. section '.code' code readable executable
    32.         start:
    33.                 ; +------------------------------+
    34.                 ; | registering the window class |
    35.                 ; +------------------------------+
    36.                 invoke  GetModuleHandle,NULL
    37.                         mov     [hInstance],eax
    38.                         mov     [wc.hInstance],eax
    39.                         mov     [wc.style],CS_HREDRAW or CS_VREDRAW
    40.                         mov     [wc.lpfnWndProc],window_procedure
    41.                         mov     [wc.lpszClassName],sClsName
    42.                         mov     [wc.lpszMenuName],30
    43.                         mov     [wc.hbrBackground],COLOR_WINDOW+1
    44.                 invoke  LoadIcon,NULL,IDI_APPLICATION
    45.                         mov     [wc.hIcon],eax
    46.                 invoke  LoadCursor,NULL,IDC_ARROW
    47.                         mov     [wc.hCursor],eax
    48.                 invoke  RegisterClass,wc
    49.  
    50.                 ; +--------------------------+
    51.                 ; | creating the main window |
    52.                 ; +--------------------------+
    53.                 invoke  CreateWindowEx,\
    54.                         WS_EX_CLIENTEDGE,\
    55.                         sClsName,\
    56.                         sTitle,\
    57.                         WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    58.                         CW_USEDEFAULT,\
    59.                         CW_USEDEFAULT,\
    60.                         300,\
    61.                         200,\
    62.                         NULL,\
    63.                         NULL,\
    64.                         [hInstance],\
    65.                         NULL
    66.                         mov     [hWindow],eax
    67.                 invoke  GetMenu,eax
    68.                         mov     [hMenu],eax
    69.  
    70.                 ; +---------------------------+
    71.                 ; | entering the message loop |
    72.                 ; +---------------------------+
    73.                 window_message_loop_start:
    74.                         invoke  GetMessage,msg,NULL,0,0
    75.                                 or      eax,eax
    76.                                 je      window_message_loop_end
    77.                         invoke  TranslateMessage,msg
    78.                         invoke  DispatchMessage,msg
    79.                                 jmp     window_message_loop_start
    80.  
    81.                 window_message_loop_end:
    82.                         invoke  ExitProcess,0
    83.  
    84.                 ; +----------------------+
    85.                 ; | the window procedure |
    86.                 ; +----------------------+
    87.                 proc window_procedure,hWnd,uMsg,wParam,lParam
    88.                         push    ebx esi edi
    89.                         cmp     [uMsg],WM_INITMENUPOPUP
    90.                         je      wmINITMENUPOPUP
    91.                         cmp     [uMsg],WM_COMMAND
    92.                         je      wmCOMMAND
    93.                         cmp     [uMsg],WM_DESTROY
    94.                         je      wmDESTROY
    95.  
    96.                         wmDEFAULT:
    97.                                 invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    98.                                         jmp     wmBYE
    99.  
    100.                         wmINITMENUPOPUP:
    101.                                 invoke  GetExitCodeProcess,[pi.hProcess],proExitCode
    102.                                         cmp     eax,TRUE
    103.                                         je      GetExitCodeProcess_TRUE
    104.                                 invoke  EnableMenuItem,[hMenu],MI_PROCESS_CREATE,MF_ENABLED
    105.                                 invoke  EnableMenuItem,[hMenu],MI_PROCESS_TERMINATE,MF_GRAYED
    106.                                         jmp     wmBYE
    107.  
    108.                                 GetExitCodeProcess_TRUE:
    109.                                                 cmp     [proExitCode],STILL_ACTIVE
    110.                                                 je      GetExitCodeProcess_STILL_ACTIVE
    111.                                         invoke  EnableMenuItem,[hMenu],MI_PROCESS_CREATE,MF_ENABLED
    112.                                         invoke  EnableMenuItem,[hMenu],MI_PROCESS_TERMINATE,MF_GRAYED
    113.                                                 jmp     wmBYE
    114.  
    115.                                         GetExitCodeProcess_STILL_ACTIVE:
    116.                                                 invoke  EnableMenuItem,[hMenu],MI_PROCESS_CREATE,MF_GRAYED
    117.                                                 invoke  EnableMenuItem,[hMenu],MI_PROCESS_TERMINATE,MF_ENABLED
    118.                                                         jmp     wmBYE
    119.  
    120.                         wmCOMMAND:
    121.                                 cmp     [wParam],0xFFFF and MI_PROCESS_CREATE
    122.                                 je      wmCOMMAND_MI_PROCESS_CREATE
    123.                                 cmp     [wParam],0xFFFF and MI_PROCESS_TERMINATE
    124.                                 je      wmCOMMAND_MI_PROCESS_TERMINATE
    125.                                 cmp     [wParam],0xFFFF and MI_EXIT
    126.                                 je      wmCOMMAND_MI_EXIT
    127.                                 jmp     wmBYE
    128.  
    129.                         wmCOMMAND_MI_EXIT:
    130.                                 invoke  DestroyWindow,[hWnd]
    131.                                         jmp     wmBYE
    132.  
    133.                         wmCOMMAND_MI_PROCESS_CREATE:
    134.                                         cmp     [pi.hProcess],0
    135.                                         je      pi_hProcess_IS_0
    136.                                 invoke  CloseHandle,[pi.hProcess]
    137.                                         mov     [pi.hProcess],0
    138.  
    139.                                 pi_hProcess_IS_0:
    140.                                         invoke  GetStartupInfo,[progStartInfo]
    141.                                         invoke  CreateProcess,progName,NULL,NULL,NULL,FALSE,\
    142.                                                 NORMAL_PRIORITY_CLASS,\
    143.                                                 NULL,NULL,progStartInfo,pi
    144.                                         invoke  CloseHandle,[pi.hThread]
    145.                                                 jmp     wmBYE
    146.  
    147.                         wmCOMMAND_MI_PROCESS_TERMINATE:
    148.                                 invoke  GetExitCodeProcess,[pi.hProcess],proExitCode
    149.                                         cmp     [proExitCode],STILL_ACTIVE
    150.                                         jne     proExitCode_NOT_STILL_ACTIVE
    151.                                 invoke  TerminateProcess,[pi.hProcess],0
    152.  
    153.                                 proExitCode_NOT_STILL_ACTIVE:
    154.                                         invoke  CloseHandle,[pi.hProcess]
    155.                                                 mov     [pi.hProcess],0
    156.                                                 jmp     wmBYE
    157.  
    158.                         wmDESTROY:
    159.                                 invoke  PostQuitMessage,0
    160.  
    161.                         wmBYE:
    162.                                 pop  edi esi ebx
    163.                                 return
    164.                 endp
    Продолжение ниже
     

    Вложения:

    • tut_14a.gif
      tut_14a.gif
      Размер файла:
      2 КБ
      Просмотров:
      3.597
    • tut_14b.gif
      tut_14b.gif
      Размер файла:
      3 КБ
      Просмотров:
      3.889
    Последнее редактирование: 12 дек 2016
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779
    Код (ASM):
    1. section '.idata' import data readable writeable
    2.         library KERNEL32,       'KERNEL32.DLL',\
    3.                 USER32,         'USER32.DLL'
    4.  
    5.         import  KERNEL32,\
    6.                         GetModuleHandle,        'GetModuleHandleA',\
    7.                         GetExitCodeProcess,     'GetExitCodeProcess',\
    8.                         GetStartupInfo,         'GetStartupInfoA',\
    9.                         CreateProcess,          'CreateProcessA',\
    10.                         TerminateProcess,       'TerminateProcess',\
    11.                         CloseHandle,            'CloseHandle',\
    12.                         ExitProcess,            'ExitProcess'
    13.  
    14.         import  USER32,\
    15.                         RegisterClass,          'RegisterClassA',\
    16.                         CreateWindowEx,         'CreateWindowExA',\
    17.                         DefWindowProc,          'DefWindowProcA',\
    18.                         LoadCursor,             'LoadCursorA',\
    19.                         LoadIcon,               'LoadIconA',\
    20.                         GetMenu,                'GetMenu',\
    21.                         EnableMenuItem,         'EnableMenuItem',\
    22.                         GetMessage,             'GetMessageA',\
    23.                         DestroyWindow,          'DestroyWindow',\
    24.                         TranslateMessage,       'TranslateMessage',\
    25.                         DispatchMessage,        'DispatchMessageA',\
    26.                         PostQuitMessage,        'PostQuitMessage'
    27.  
    28. section '.rsrc' resource data readable
    29.         directory       RT_MENU,appMenu
    30.  
    31.         resource        appMenu,\
    32.                         30,LANG_NEUTRAL,menuMain
    33.  
    34.         menu    menuMain
    35.                 menuitem        '&Process',0,MFR_POPUP + MFR_END
    36.                 menuitem                '&Create Process',MI_PROCESS_CREATE,0
    37.                 menuitem                '&Terminate Process',MI_PROCESS_TERMINATE,0
    38.                                         menuseparator
    39.                 menuitem                'E&xit',MI_EXIT,MFR_END
    40.  
    [​IMG]
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 15. Треды (ветви)


    Код (ASM):
    1. ; +-------------+
    2. ; | tut_15a.asm |
    3. ; +-------------+
    4. format PE GUI 4.0
    5. entry start
    6.  
    7. include '%fasminc%\win32a.inc'
    8.  
    9. ; +-----------------------+
    10. ; | menu item declaration |
    11. ; +-----------------------+
    12. MI_THREAD_CREATE     equ    110
    13. MI_EXIT              equ    190
    14.  
    15. WMU_THREAD_FINISH    equ    WM_USER + 0x100
    16.  
    17. section '.data' data readable writeable
    18.        wTitle        db     'Tutorial 15A',0
    19.        wClsName      db     'TUT15A',0
    20.        
    21.        hWindow       dd     ?
    22.        hInstance     dd     ?
    23.        msg           MSG
    24.        wc            WNDCLASS
    25.        
    26.        hMenu         dd     ?
    27.        tId           dd     ?
    28.  
    29. section '.code' code readable executable
    30.        start:
    31.               ; +------------------------------+
    32.               ; | registering the window class |
    33.               ; +------------------------------+
    34.               invoke GetModuleHandle,NULL
    35.                      mov    [hInstance],eax
    36.                      mov    [wc.hInstance],eax
    37.                      mov    [wc.lpfnWndProc],window_procedure
    38.                      mov    [wc.lpszClassName],wClsName
    39.                      mov    [wc.lpszMenuName],30
    40.                      mov    [wc.hbrBackground],COLOR_WINDOW+1
    41.               invoke LoadIcon,NULL,IDI_APPLICATION
    42.                      mov    [wc.hIcon],eax
    43.               invoke LoadCursor,NULL,IDC_ARROW
    44.                      mov    [wc.hCursor],eax
    45.               invoke RegisterClass,wc
    46.  
    47.               ; +--------------------------+
    48.               ; | creating the main window |
    49.               ; +--------------------------+
    50.               invoke CreateWindowEx,\
    51.                      WS_EX_CLIENTEDGE,\
    52.                      wClsName,\
    53.                      wTitle,\
    54.                      WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    55.                      CW_USEDEFAULT,\
    56.                      CW_USEDEFAULT,\
    57.                      300,\
    58.                      200,\
    59.                      NULL,\
    60.                      NULL,\
    61.                      [hInstance],\
    62.                      NULL
    63.                      mov    [hWindow],eax
    64.               invoke GetMenu,eax
    65.                      mov    [hMenu],eax
    66.  
    67.               ; +---------------------------+
    68.               ; | entering the message loop |
    69.               ; +---------------------------+
    70.               window_message_loop_start:
    71.                      invoke GetMessage,msg,NULL,0,0
    72.                             or     eax,eax
    73.                             je     window_message_loop_end
    74.                      invoke TranslateMessage,msg
    75.                      invoke DispatchMessage,msg
    76.                             jmp    window_message_loop_start
    77.  
    78.               window_message_loop_end:
    79.                      invoke ExitProcess,0
    80.  
    81.               ; +----------------------+
    82.               ; | the window procedure |
    83.               ; +----------------------+
    84.               proc window_procedure,hWnd,uMsg,wParam,lParam
    85.                      push   ebx esi edi
    86.                      cmp    [uMsg],WM_COMMAND
    87.                      je     wmCOMMAND
    88.                      cmp    [uMsg],WMU_THREAD_FINISH
    89.                      je     wmuTHREAD_FINISH
    90.                      cmp    [uMsg],WM_DESTROY
    91.                      je     wmDESTROY
    92.                      
    93.                      wmDEFAULT:
    94.                             invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    95.                                    jmp    wmBYE
    96.  
    97.                      wmuTHREAD_FINISH:
    98.                             invoke MessageBox,NULL,wTitle,wTitle,MB_OK
    99.                                    jmp    wmBYE
    100.  
    101.                      wmCOMMAND:
    102.                             cmp    [wParam],0xFFFF and MI_THREAD_CREATE
    103.                             je     wmCOMMAND_MI_THREAD_CREATE
    104.                             cmp    [wParam],0xFFFF and MI_EXIT
    105.                             je     wmCOMMAND_MI_EXIT
    106.                             jmp    wmBYE
    107.                      
    108.                      wmCOMMAND_MI_THREAD_CREATE:
    109.                                    mov    eax,thread_procedure
    110.                             invoke CreateThread,NULL,0,eax,NULL,NORMAL_PRIORITY_CLASS,tId
    111.                             invoke CloseHandle,eax
    112.                                    jmp    wmBYE
    113.                      
    114.                      wmCOMMAND_MI_EXIT:
    115.                             invoke DestroyWindow,[hWnd]
    116.                                    jmp    wmBYE
    117.  
    118.                      wmDESTROY:
    119.                             invoke PostQuitMessage,0
    120.  
    121.                      wmBYE:
    122.                             pop  edi esi ebx
    123.                             return
    124.               endp
    125.  
    126.               ; +------------------+
    127.               ; | thread procedure |
    128.               ; +------------------+
    129.               proc   thread_procedure
    130.                      mov    ecx,0x3FFFFFFF
    131.                      loopSTART:
    132.                             add    eax,eax
    133.                             dec    ecx
    134.                             jz     loopEND
    135.                             jmp    loopSTART
    136.                      loopEND:
    137.                             invoke SendMessage,[hWindow],WMU_THREAD_FINISH,NULL,NULL
    138.                             return
    139.               endp
    140. section '.idata' import data readable writeable
    141.        library       KERNEL32,     'KERNEL32.DLL',\
    142.                      USER32,       'USER32.DLL'
    143.  
    144.        import KERNEL32,\
    145.                      GetModuleHandle,     'GetModuleHandleA',\
    146.                      ExitProcess,         'ExitProcess'
    147.  
    148.        import USER32,\
    149.                      RegisterClass,       'RegisterClassA',\
    150.                      CreateWindowEx,      'CreateWindowExA',\
    151.                      DefWindowProc,       'DefWindowProcA',\
    152.                      LoadCursor,          'LoadCursorA',\
    153.                      LoadIcon,            'LoadIconA',\
    154.                      GetMenu,             'GetMenu',\
    155.                      MessageBox,          'MessageBoxA',\
    156.                      SendMessage,         'SendMessageA',\
    157.                      GetMessage,          'GetMessageA',\
    158.                      DestroyWindow,       'DestroyWindow',\
    159.                      TranslateMessage,    'TranslateMessage',\
    160.                      DispatchMessage,     'DispatchMessageA',\
    161.                      PostQuitMessage,     'PostQuitMessage'
    162.  
    163. section '.rsrc' resource data readable
    164.        directory     RT_MENU,appMenu
    165.        
    166.        resource      appMenu,\
    167.                      30,LANG_NEUTRAL,menuMain
    168.  
    169.        menu   menuMain
    170.               menuitem      '&Process',0,MFR_POPUP + MFR_END
    171.               menuitem             '&Create Thread',MI_THREAD_CREATE,0
    172.                                    menuseparator
    173.               menuitem             'E&xit',MI_EXIT,MFR_END
    174.  
    Результат
    [​IMG]
     

    Вложения:

    • tut_15a.gif
      tut_15a.gif
      Размер файла:
      2,8 КБ
      Просмотров:
      3.881
    • tut_15b.gif
      tut_15b.gif
      Размер файла:
      3 КБ
      Просмотров:
      3.905
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779
    Код (ASM):
    1. ; +-------------+
    2. ; | tut_15b.asm |
    3. ; +-------------+
    4. format PE GUI 4.0
    5. entry start
    6.  
    7. include '%fasminc%\win32a.inc'
    8.  
    9. ; +-----------------------+
    10. ; | menu item declaration |
    11. ; +-----------------------+
    12. MI_CALCULATE_PRIMARY_THREAD equ    110
    13. MI_EXIT                     equ    190
    14.  
    15. WMU_CALCULATE_FINISH        equ    WM_USER + 0x100
    16.  
    17. section '.data' data readable writeable
    18.        wTitle        db     'Tutorial 15B',0
    19.        wClsName      db     'TUT15B',0
    20.        
    21.        hWindow       dd     ?
    22.        hInstance     dd     ?
    23.        msg           MSG
    24.        wc            WNDCLASS
    25.        
    26.        hMenu         dd     ?
    27.  
    28. section '.code' code readable executable
    29.        start:
    30.               ; +------------------------------+
    31.               ; | registering the window class |
    32.               ; +------------------------------+
    33.               invoke GetModuleHandle,NULL
    34.                      mov    [hInstance],eax
    35.                      mov    [wc.hInstance],eax
    36.                      mov    [wc.lpfnWndProc],window_procedure
    37.                      mov    [wc.lpszClassName],wClsName
    38.                      mov    [wc.lpszMenuName],30
    39.                      mov    [wc.hbrBackground],COLOR_WINDOW+1
    40.               invoke LoadIcon,NULL,IDI_APPLICATION
    41.                      mov    [wc.hIcon],eax
    42.               invoke LoadCursor,NULL,IDC_ARROW
    43.                      mov    [wc.hCursor],eax
    44.               invoke RegisterClass,wc
    45.  
    46.               ; +--------------------------+
    47.               ; | creating the main window |
    48.               ; +--------------------------+
    49.               invoke CreateWindowEx,\
    50.                      WS_EX_CLIENTEDGE,\
    51.                      wClsName,\
    52.                      wTitle,\
    53.                      WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    54.                      CW_USEDEFAULT,\
    55.                      CW_USEDEFAULT,\
    56.                      300,\
    57.                      200,\
    58.                      NULL,\
    59.                      NULL,\
    60.                      [hInstance],\
    61.                      NULL
    62.                      mov    [hWindow],eax
    63.               invoke GetMenu,eax
    64.                      mov    [hMenu],eax
    65.  
    66.               ; +---------------------------+
    67.               ; | entering the message loop |
    68.               ; +---------------------------+
    69.               window_message_loop_start:
    70.                      invoke GetMessage,msg,NULL,0,0
    71.                             or     eax,eax
    72.                             je     window_message_loop_end
    73.                      invoke TranslateMessage,msg
    74.                      invoke DispatchMessage,msg
    75.                             jmp    window_message_loop_start
    76.  
    77.               window_message_loop_end:
    78.                      invoke ExitProcess,0
    79.  
    80.               ; +----------------------+
    81.               ; | the window procedure |
    82.               ; +----------------------+
    83.               proc window_procedure,hWnd,uMsg,wParam,lParam
    84.                      push   ebx esi edi
    85.                      cmp    [uMsg],WM_COMMAND
    86.                      je     wmCOMMAND
    87.                      cmp    [uMsg],WMU_CALCULATE_FINISH
    88.                      je     wmuCALCULATE_FINISH
    89.                      cmp    [uMsg],WM_DESTROY
    90.                      je     wmDESTROY
    91.                      
    92.                      wmDEFAULT:
    93.                             invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    94.                                    jmp    wmBYE
    95.  
    96.                      wmuCALCULATE_FINISH:
    97.                             invoke MessageBox,NULL,wTitle,wTitle,MB_OK
    98.                                    jmp    wmBYE
    99.  
    100.                      wmCOMMAND:
    101.                             cmp    [wParam],0xFFFF and MI_CALCULATE_PRIMARY_THREAD
    102.                             je     wmCOMMAND_MI_CALCULATE_PRIMARY_THREAD
    103.                             cmp    [wParam],0xFFFF and MI_EXIT
    104.                             je     wmCOMMAND_MI_EXIT
    105.                             jmp    wmBYE
    106.                      
    107.                      wmCOMMAND_MI_CALCULATE_PRIMARY_THREAD:
    108.                             call   calculate_procedure
    109.                             jmp    wmBYE
    110.                      
    111.                      wmCOMMAND_MI_EXIT:
    112.                             invoke DestroyWindow,[hWnd]
    113.                                    jmp    wmBYE
    114.  
    115.                      wmDESTROY:
    116.                             invoke PostQuitMessage,0
    117.  
    118.                      wmBYE:
    119.                             pop  edi esi ebx
    120.                             return
    121.               endp
    122.  
    123.               ; +------------------+
    124.               ; | thread procedure |
    125.               ; +------------------+
    126.               proc   calculate_procedure
    127.                      mov    ecx,0x3FFFFFFF
    128.                      loopSTART:
    129.                             add    eax,eax
    130.                             dec    ecx
    131.                             jz     loopEND
    132.                             jmp    loopSTART
    133.                      loopEND:
    134.                             invoke SendMessage,[hWindow],WMU_CALCULATE_FINISH,NULL,NULL
    135.                             return
    136.               endp
    137. section '.idata' import data readable writeable
    138.        library       KERNEL32,     'KERNEL32.DLL',\
    139.                      USER32,       'USER32.DLL'
    140.  
    141.        import KERNEL32,\
    142.                      GetModuleHandle,     'GetModuleHandleA',\
    143.                      CreateThread,        'CreateThread',\
    144.                      GetExitCodeProcess,  'GetExitCodeProcess',\
    145.                      GetStartupInfo,      'GetStartupInfoA',\
    146.                      CreateProcess,       'CreateProcessA',\
    147.                      TerminateProcess,    'TerminateProcess',\
    148.                      CloseHandle,         'CloseHandle',\
    149.                      ExitProcess,         'ExitProcess'
    150.  
    151.        import USER32,\
    152.                      RegisterClass,       'RegisterClassA',\
    153.                      CreateWindowEx,      'CreateWindowExA',\
    154.                      DefWindowProc,       'DefWindowProcA',\
    155.                      LoadCursor,          'LoadCursorA',\
    156.                      LoadIcon,            'LoadIconA',\
    157.                      GetMenu,             'GetMenu',\
    158.                      EnableMenuItem,      'EnableMenuItem',\
    159.                      MessageBox,          'MessageBoxA',\
    160.                      SendMessage,         'SendMessageA',\
    161.                      GetMessage,          'GetMessageA',\
    162.                      DestroyWindow,       'DestroyWindow',\
    163.                      TranslateMessage,    'TranslateMessage',\
    164.                      DispatchMessage,     'DispatchMessageA',\
    165.                      PostQuitMessage,     'PostQuitMessage'
    166.  
    167. section '.rsrc' resource data readable
    168.        directory     RT_MENU,appMenu
    169.        
    170.        resource      appMenu,\
    171.                      30,LANG_NEUTRAL,menuMain
    172.  
    173.        menu   menuMain
    174.               menuitem      '&Process',0,MFR_POPUP + MFR_END
    175.               menuitem             '&Calculate in Primary Thread',MI_CALCULATE_PRIMARY_THREAD,0
    176.                                    menuseparator
    177.               menuitem             'E&xit',MI_EXIT,MFR_END
    178.  
    Результат
    [​IMG]
     
    rococo795 нравится это.
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    2.779

    Win32 API. Урок 16. Объект события

    Код (ASM):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. ; +-----------------------+
    7. ; | menu item declaration |
    8. ; +-----------------------+
    9. MI_THREAD_RUN        equ    110
    10. MI_THREAD_STOP       equ    111
    11. MI_EXIT              equ    190
    12.  
    13. WMU_THREAD_FINISH    equ    WM_USER + 0x100
    14.  
    15. INFINITE             equ    0xFFFFFFFF
    16.  
    17. section '.data' data readable writeable
    18.        wTitle        db     'Tutorial 16',0
    19.        wClsName      db     'TUT16',0
    20.        
    21.        hWindow       dd     ?
    22.        hInstance     dd     ?
    23.        msg           MSG
    24.        wc            WNDCLASS
    25.        
    26.        hMenu         dd     ?
    27.        hThread       dd     ?
    28.        hEvent        dd     ?
    29.        
    30.        tId           dd     ?      ;thread id
    31.        tEventState   dd     0      ;thread event state, 0 = runnable, 1 = stop
    32.        
    33.        info1         db     'The Calculation is Completed!',0
    34.        info2         db     'The Thread is Stop!',0
    35.  
    36. section '.code' code readable executable
    37.        start:
    38.               ; +------------------------------+
    39.               ; | registering the window class |
    40.               ; +------------------------------+
    41.               invoke GetModuleHandle,NULL
    42.                      mov    [hInstance],eax
    43.                      mov    [wc.hInstance],eax
    44.                      mov    [wc.lpfnWndProc],window_procedure
    45.                      mov    [wc.lpszClassName],wClsName
    46.                      mov    [wc.lpszMenuName],30
    47.                      mov    [wc.hbrBackground],COLOR_WINDOW+1
    48.               invoke LoadIcon,NULL,IDI_APPLICATION
    49.                      mov    [wc.hIcon],eax
    50.               invoke LoadCursor,NULL,IDC_ARROW
    51.                      mov    [wc.hCursor],eax
    52.               invoke RegisterClass,wc
    53.  
    54.               ; +--------------------------+
    55.               ; | creating the main window |
    56.               ; +--------------------------+
    57.               invoke CreateWindowEx,\
    58.                      WS_EX_CLIENTEDGE,\
    59.                      wClsName,\
    60.                      wTitle,\
    61.                      WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    62.                      CW_USEDEFAULT,\
    63.                      CW_USEDEFAULT,\
    64.                      300,\
    65.                      200,\
    66.                      NULL,\
    67.                      NULL,\
    68.                      [hInstance],\
    69.                      NULL
    70.                      mov    [hWindow],eax
    71.               invoke GetMenu,eax
    72.                      mov    [hMenu],eax
    73.  
    74.               ; +---------------------------+
    75.               ; | entering the message loop |
    76.               ; +---------------------------+
    77.               window_message_loop_start:
    78.                      invoke GetMessage,msg,NULL,0,0
    79.                             or     eax,eax
    80.                             je     window_message_loop_end
    81.                      invoke TranslateMessage,msg
    82.                      invoke DispatchMessage,msg
    83.                             jmp    window_message_loop_start
    84.  
    85.               window_message_loop_end:
    86.                      invoke ExitProcess,0
    87.  
    88.               ; +----------------------+
    89.               ; | the window procedure |
    90.               ; +----------------------+
    91.               proc window_procedure,hWnd,uMsg,wParam,lParam
    92.                      push   ebx esi edi
    93.                      cmp    [uMsg],WM_COMMAND
    94.                      je     wmCOMMAND
    95.                      cmp    [uMsg],WM_CREATE
    96.                      je     wmCREATE
    97.                      cmp    [uMsg],WMU_THREAD_FINISH
    98.                      je     wmuTHREAD_FINISH
    99.                      cmp    [uMsg],WM_DESTROY
    100.                      je     wmDESTROY
    101.                      
    102.                      wmDEFAULT:
    103.                             invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    104.                                    jmp    wmBYE
    105.  
    106.                      wmuTHREAD_FINISH:
    107.                             invoke MessageBox,NULL,info1,wTitle,MB_OK
    108.                                    jmp    wmBYE
    109.  
    110.                      wmCREATE:
    111.                             invoke CreateEvent,NULL,FALSE,FALSE,NULL
    112.                                    mov    [hEvent],eax
    113.                                    mov    eax,thread_procedure
    114.                             invoke CreateThread,NULL,0,eax,NULL,NORMAL_PRIORITY_CLASS,tId
    115.                             invoke CloseHandle,eax
    116.                                    jmp    wmBYE
    117.                      
    118.                      wmCOMMAND:
    119.                             cmp    [wParam],0xFFFF and MI_THREAD_RUN
    120.                             je     wmCOMMAND_MI_THREAD_RUN
    121.                             cmp    [wParam],0xFFFF and MI_THREAD_STOP
    122.                             je     wmCOMMAND_MI_THREAD_STOP
    123.                             cmp    [wParam],0xFFFF and MI_EXIT
    124.                             je     wmCOMMAND_MI_EXIT
    125.                             jmp    wmBYE
    126.                      
    127.                      wmCOMMAND_MI_THREAD_RUN:
    128.                             invoke SetEvent,[hEvent]
    129.                             invoke EnableMenuItem,[hMenu],MI_THREAD_RUN,MF_GRAYED
    130.                             invoke EnableMenuItem,[hMenu],MI_THREAD_STOP,MF_ENABLED
    131.                                    jmp    wmBYE
    132.  
    133.                      wmCOMMAND_MI_THREAD_STOP:
    134.                                    mov    [tEventState],1      ;stop
    135.                             invoke EnableMenuItem,[hMenu],MI_THREAD_RUN,MF_ENABLED
    136.                             invoke EnableMenuItem,[hMenu],MI_THREAD_STOP,MF_GRAYED
    137.                                    jmp    wmBYE
    138.  
    139.                      wmCOMMAND_MI_EXIT:
    140.                             invoke DestroyWindow,[hWnd]
    141.                                    jmp    wmBYE
    142.  
    143.                      wmDESTROY:
    144.                             invoke PostQuitMessage,0
    145.  
    146.                      wmBYE:
    147.                             pop  edi esi ebx
    148.                             return
    149.               endp
    150.  
    151.               ; +------------------+
    152.               ; | thread procedure |
    153.               ; +------------------+
    154.               proc   thread_procedure
    155.                      invoke WaitForSingleObject,[hEvent],INFINITE
    156.                             mov    ecx,0xFFFFFFF
    157.                      loopINIT:
    158.                                    cmp    ecx,0
    159.                                    je     loopEND
    160.                                    cmp    [tEventState],0      ;runnable
    161.                                    je     loopSTART
    162.                             invoke MessageBox,[hWindow],info2,wTitle,MB_OK
    163.                                    mov    [tEventState],0      ;runnable
    164.                                    jmp    thread_procedure
    165.                      loopSTART:
    166.                                    add    eax,eax
    167.                                    dec    ecx
    168.                                    jmp    loopINIT
    169.                      loopEND:
    170.                             invoke PostMessage,[hWindow],WMU_THREAD_FINISH,NULL,NULL
    171.                             invoke EnableMenuItem,[hMenu],MI_THREAD_RUN,MF_ENABLED
    172.                             invoke EnableMenuItem,[hMenu],MI_THREAD_STOP,MF_GRAYED
    173.                                    jmp    thread_procedure
    174.                             return
    175.               endp
    176. section '.idata' import data readable writeable
    177.        library       KERNEL32,     'KERNEL32.DLL',\
    178.                      USER32,       'USER32.DLL'
    179.  
    180.        import KERNEL32,\
    181.                      GetModuleHandle,     'GetModuleHandleA',\
    182.                      CreateThread,        'CreateThread',\
    183.                      CloseHandle,         'CloseHandle',\
    184.                      CreateEvent,         'CreateEventA',\
    185.                      SetEvent,            'SetEvent',\
    186.                      WaitForSingleObject, 'WaitForSingleObject',\
    187.                      ExitProcess,         'ExitProcess'
    188.  
    189.        import USER32,\
    190.                      RegisterClass,       'RegisterClassA',\
    191.                      CreateWindowEx,      'CreateWindowExA',\
    192.                      DefWindowProc,       'DefWindowProcA',\
    193.                      LoadCursor,          'LoadCursorA',\
    194.                      LoadIcon,            'LoadIconA',\
    195.                      GetMenu,             'GetMenu',\
    196.                      EnableMenuItem,      'EnableMenuItem',\
    197.                      MessageBox,          'MessageBoxA',\
    198.                      PostMessage,         'PostMessageA',\
    199.                      GetMessage,          'GetMessageA',\
    200.                      DestroyWindow,       'DestroyWindow',\
    201.                      TranslateMessage,    'TranslateMessage',\
    202.                      DispatchMessage,     'DispatchMessageA',\
    203.                      PostQuitMessage,     'PostQuitMessage'
    204.  
    205. section '.rsrc' resource data readable
    206.        directory     RT_MENU,appMenu
    207.        
    208.        resource      appMenu,\
    209.                      30,LANG_NEUTRAL,menuMain
    210.  
    211.        menu   menuMain
    212.               menuitem      '&Thread',0,MFR_POPUP + MFR_END
    213.               menuitem             '&Run Thread',MI_THREAD_RUN,0
    214.               menuitem             '&Stop Thread',MI_THREAD_STOP,0,,MF_GRAYED
    215.                                    menuseparator
    216.               menuitem             'E&xit',MI_EXIT,MFR_END
    217.  
    Результат
    [​IMG]
     

    Вложения:

    • tut_16.gif
      tut_16.gif
      Размер файла:
      3,9 КБ
      Просмотров:
      3.919