GUI - приложение с кнопкой

Тема в разделе "WASM.BEGINNERS", создана пользователем Entropy, 11 янв 2026.

Статус темы:
Закрыта.
  1. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    Да про это мы в курсе. А перед этим, ещё всякие хитрые макросы внедряются - в которых без Иды хрен разберёшся. :) Кстати, а что это за функция такая хитрая у вас в примере окна с одной кнопкой - NtdllDefWindowProc_А ? У меня ваш пример с ней не компилируется, приходится менять на обычную
    DefWindowProc. В нете пишут, что она какая-то хакерская. Не просветите начинающего хакера? :)
     
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.205
    GRAFik,
    dllфункция оберткаdllоригинальная
    функция
    user32.dllDefWindowProcANTDLL.dllNtdllDefWindowProc_A
    DefWindowProcWNtdllDefWindowProc_W
    DefDlgProcANtdllDialogWndProc_A
    DefDlgProcWNtdllDialogWndProc_W
    kernel32.dllExitProcessRtlExitUserProcess
    это в Сказках дядюшки Римуса о x64 → глава "Создание inc- и lib-файлов из системных dll"
     
    miilalex нравится это.
  3. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    Спасибо за информацию. Немного поясню:
    Вы когда мне пример простого окна с одной кнопкой скинули, я как раз с VS 2022 разбирался - как с помощью неё компилировать код для MASM64. Ну и решил убрать все эти макросы, которые были в вашем source, который "заточен" под ваш SDK (ну или набор ml64 и т.п...). Глянул в Иде ваш exe-файл, а там
    NtdllDefWindowProc_А - отсюда и возник вопрос.
     
  4. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    попытался переделать приложение под х64,и в итоге получилась не работающая хрень
    Код (ASM):
    1.  
    2. option casemap:none
    3.  
    4.  
    5.  
    6. include win64.inc
    7. include user32.inc
    8. include kernel32.inc
    9.  
    10.  
    11. includelib w64prj\lib64\kernel32.lib
    12. includelib w64prj\lib64\user32.lib
    13.  
    14.  
    15.  
    16. public main
    17.  
    18. .data
    19.  
    20. win_msg MSG <>
    21. wc WNDCLASSEX <>
    22. win_desc dword ?
    23. btn_desc dword ?
    24.  
    25. name_win_class db 'wclass',0
    26. caption db 'btn',0
    27.  
    28. button db 'button',0
    29.  
    30.  
    31. .code
    32.  
    33. main:
    34.  
    35.  
    36. sub rsp,40
    37.  
    38. mov rcx,0
    39. call GetModuleHandleA
    40.  
    41.  
    42.     mov wc.cbSize,sizeof WNDCLASSEX
    43.     mov wc.style,0
    44. lea rbx,wndproc
    45.     mov wc.lpfnWndProc,rbx
    46.     mov wc.cbClsExtra,0
    47.     mov wc.cbWndExtra,0
    48.     mov wc.hInstance,rax  
    49.     mov wc.hbrBackground,COLOR_BTNFACE+1
    50.     mov wc.lpszMenuName,0
    51. lea rax,name_win_class
    52.     mov wc.lpszClassName,rax
    53.     mov wc.hIcon,0
    54.     mov wc.hCursor,0
    55.     mov wc.hIconSm,0
    56.  
    57. mov rcx,offset wc
    58. call RegisterClassEx
    59.  
    60.  
    61. mov rcx,0
    62. call GetModuleHandleA
    63.  
    64.  
    65.  
    66.  
    67. mov rcx,0
    68. lea rdx,name_win_class
    69. lea r8,caption
    70. mov r9,WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_OVERLAPPED
    71. push 0
    72. push rax
    73. push 0
    74. push 0
    75. push 400
    76. push 400
    77. push 100
    78. push 100
    79. sub rsp,96
    80. call CreateWindowExA
    81.  
    82. mov qword ptr win_desc,rax
    83.  
    84.  
    85. xor rbx,rbx
    86. mov rbx,qword ptr [wc.hInstance]
    87.  
    88.  
    89. mov rcx,0
    90. lea rdx,button
    91. lea r8,caption
    92. mov r9,WS_CHILD or WS_VISIBLE or WS_BORDER or BS_PUSHBUTTON
    93. push 0
    94. push rbx
    95. push 0100h
    96. push rax
    97. push 30
    98. push 30
    99. push 100
    100. push 100
    101. sub rsp,96
    102. call CreateWindowExA
    103.  
    104.  
    105. mov eax,dword ptr [win_desc]
    106. msgloop:
    107.  
    108. mov rcx,offset win_msg
    109. mov rdx,rax
    110. mov r8,0
    111. mov r9,0
    112. call GetMessage
    113.  
    114. mov rcx,offset win_msg
    115. call TranslateMessage
    116.  
    117. mov rcx,offset win_msg
    118. call DispatchMessage
    119. mov eax,dword ptr [win_desc]
    120. jmp msgloop
    121.  
    122.  
    123.  
    124. wndproc proc hWin   :QWORD,
    125.              uMsg   :QWORD,
    126.              wParam :QWORD,
    127.              lParam :QWORD
    128.  
    129. cmp qword ptr uMsg,WM_COMMAND
    130. je stop_btn
    131. jmp @F
    132.  
    133.  
    134. stop_btn:
    135. cmp qword ptr wParam,BN_CLICKED SHL 16 + 0100h
    136. je exit
    137.  
    138.  
    139.     cmp qword ptr uMsg, WM_DESTROY
    140.     jne @F
    141.  
    142. xor rcx,rcx
    143.  
    144. call ExitProcess
    145.    
    146.     @@:
    147.    
    148. mov rcx,qword ptr hWin
    149. mov rdx,qword ptr uMsg
    150. mov r8,qword ptr wParam
    151. mov r9,qword ptr lParam
    152.  
    153. call DefWindowProc
    154. add rsp,32
    155.  
    156.     ret
    157.  
    158. exit:
    159. xor rcx,rcx
    160.  
    161. call ExitProcess
    162.  
    163. wndproc endp
    164.  
    165.  
    166.  
    167. end
     
    Последнее редактирование модератором: 22 фев 2026
  5. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    568
    Наверное потому, что в программе какая-то ошибка.

    Пройдись уж дебаггером, не заходя в системные вызовы, и посмотри, что у тебя творится с RSP, особенно до и после вызова, а таже убедись, что перед самым CALL он выровнен на 16 и что аргументы выше 4-го лежат по требуемым смещениям. Если тебе так уж хочется класть аргументы в стек через PUSH, то хотя бы контролируй, что куда в стеке попадает. Нафига у тебя еще и sub rsp,96 после пушей? И кто будет возвращать стек в предыдущее состояние? Это ж не stdcall

    Еще в wndproc ты не зарезервировал место в стеке для вызова DefWindowProc, хотя после вызова восстановил RSP.

    Впрочем, сегодня прощенное воскресение, я тебя прощаю :) Но WinAPI не прощает, оно не православное :)
     
    Последнее редактирование: 22 фев 2026
    miilalex и M0rg0t нравится это.
  6. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    Вариант для компиляции средствами Visual Studio (MASM64).
    При желании можно адаптировать для SDK Хатчисона или Mikl___.
    Код (ASM):
    1. ;================== Простое окно ===============
    2.  
    3. option casemap:none
    4.  
    5. ; ================== CONSTANTS ==================
    6.  
    7. WM_DESTROY              equ 2
    8. WS_OVERLAPPEDWINDOW     equ 0CF0000h
    9. CW_USEDEFAULT           equ 80000000h
    10. SW_SHOWNORMAL           equ 1
    11. COLOR_WINDOW            equ 5
    12.  
    13. ; ================== STRUCTURES ==================
    14.  
    15. WNDCLASSEX STRUCT
    16.     cbSize          DWORD ?
    17.     style           DWORD ?
    18.     lpfnWndProc     QWORD ?
    19.     cbClsExtra      DWORD ?
    20.     cbWndExtra      DWORD ?
    21.     hInstance       QWORD ?
    22.     hIcon           QWORD ?
    23.     hCursor         QWORD ?
    24.     hbrBackground   QWORD ?
    25.     lpszMenuName    QWORD ?
    26.     lpszClassName   QWORD ?
    27.     hIconSm         QWORD ?
    28. WNDCLASSEX ENDS
    29.  
    30. MSG STRUCT
    31.     hwnd    QWORD ?
    32.     msg     DWORD ?
    33.     wParam  QWORD ?
    34.     lParam  QWORD ?
    35.     time    DWORD ?
    36.     pt_x    DWORD ?
    37.     pt_y    DWORD ?
    38. MSG ENDS
    39.  
    40. ; ================== DATA ==================
    41.  
    42. .data
    43. ClassName  db "MASM64Class",0
    44. WinTitle   db "MASM64 WORKING WINDOW",0
    45.  
    46. wc      WNDCLASSEX <>
    47. msg     MSG <>
    48. hInst   QWORD ?
    49. hWnd    QWORD ?
    50.  
    51. ; ================== IMPORTS ==================
    52.  
    53. extrn GetModuleHandleA     :proc
    54. extrn RegisterClassExA     :proc
    55. extrn CreateWindowExA      :proc
    56. extrn ShowWindow           :proc
    57. extrn UpdateWindow         :proc
    58. extrn GetMessageA          :proc
    59. extrn TranslateMessage    :proc
    60. extrn DispatchMessageA    :proc
    61. extrn DefWindowProcA      :proc
    62. extrn PostQuitMessage     :proc
    63. extrn ExitProcess         :proc
    64.  
    65. ; ================== CODE ==================
    66.  
    67. .code
    68.  
    69. WinMain PROC
    70.     sub rsp, 68h                ; shadow + args
    71.  
    72.     ; hInst = GetModuleHandle(NULL)
    73.     xor rcx, rcx
    74.     call GetModuleHandleA
    75.     mov hInst, rax
    76.  
    77.     ; ---- WNDCLASSEX ----
    78.     mov wc.cbSize, SIZEOF WNDCLASSEX
    79.     mov wc.style, 0
    80.     lea rax, WndProc
    81.     mov wc.lpfnWndProc, rax
    82.     mov wc.cbClsExtra, 0
    83.     mov wc.cbWndExtra, 0
    84.     mov rax, hInst
    85.     mov wc.hInstance, rax
    86.     mov wc.hIcon, 0
    87.     mov wc.hCursor, 0
    88.     mov wc.hbrBackground, COLOR_WINDOW + 1
    89.     mov wc.lpszMenuName, 0
    90.     lea rax, ClassName
    91.     mov wc.lpszClassName, rax
    92.     mov wc.hIconSm, 0
    93.  
    94.     lea rcx, wc
    95.     call RegisterClassExA
    96.     test eax, eax
    97.     jz exit                    ; если класс не зарегистрировался
    98.  
    99.     ; ---- CreateWindowExA ----
    100.     xor rcx, rcx               ; dwExStyle
    101.     lea rdx, ClassName         ; lpClassName
    102.     lea r8,  WinTitle          ; lpWindowName
    103.     mov r9d, WS_OVERLAPPEDWINDOW
    104.  
    105.     mov qword ptr [rsp+20h], CW_USEDEFAULT ; X
    106.     mov qword ptr [rsp+28h], CW_USEDEFAULT ; Y
    107.     mov qword ptr [rsp+30h], 800            ; Width
    108.     mov qword ptr [rsp+38h], 600            ; Height
    109.     mov qword ptr [rsp+40h], 0              ; hWndParent
    110.     mov qword ptr [rsp+48h], 0              ; hMenu
    111.     mov rax, hInst
    112.     mov qword ptr [rsp+50h], rax            ; hInstance
    113.     mov qword ptr [rsp+58h], 0              ; lpParam
    114.  
    115.     call CreateWindowExA
    116.     test rax, rax
    117.     jz exit
    118.  
    119.     mov hWnd, rax
    120.  
    121.     ; Show + Update
    122.     mov rcx, hWnd
    123.     mov edx, SW_SHOWNORMAL
    124.     call ShowWindow
    125.  
    126.     mov rcx, hWnd
    127.     call UpdateWindow
    128.  
    129. ; ================== MESSAGE LOOP ==================
    130.  
    131. msg_loop:
    132.     lea rcx, msg
    133.     xor rdx, rdx
    134.     xor r8,  r8
    135.     xor r9,  r9
    136.     call GetMessageA
    137.     test eax, eax
    138.     jz exit
    139.  
    140.     lea rcx, msg
    141.     call TranslateMessage
    142.     lea rcx, msg
    143.     call DispatchMessageA
    144.     jmp msg_loop
    145.  
    146. exit:
    147.     xor ecx, ecx
    148.     call ExitProcess
    149. WinMain ENDP
    150.  
    151. ; ================== WNDPROC ==================
    152.  
    153. WndProc PROC
    154.     sub rsp, 28h
    155.  
    156.     cmp edx, WM_DESTROY
    157.     jne defproc
    158.  
    159.     xor ecx, ecx
    160.     call PostQuitMessage
    161.     xor eax, eax
    162.     ret
    163.  
    164. defproc:
    165.     mov rcx, rcx        ; HWND
    166.     mov rdx, rdx        ; uMsg
    167.     mov r8,  r8         ; wParam
    168.     mov r9,  r9         ; lParam
    169.     call DefWindowProcA
    170.     add rsp, 28h
    171.     ret
    172. WndProc ENDP
    173.  
    174. END
     
  7. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    я сначала подумал что компилятор ML64,неправильно компилит мой код,в идеале, что написано то и скомпилированно
    Код (ASM):
    1.  
    2. option casemap:none
    3.  
    4.  
    5.  
    6. include win64.inc
    7. include user32.inc
    8. include kernel32.inc
    9.  
    10.  
    11. includelib w64prj\lib64\kernel32.lib
    12. includelib w64prj\lib64\user32.lib
    13.  
    14.  
    15.  
    16. public main
    17.  
    18. .data
    19.  
    20. win_msg MSG <>
    21. wc WNDCLASSEX <>
    22. win_desc dword ?
    23. btn_desc dword ?
    24.  
    25. name_win_class db 'wclass',0
    26. caption db 'btn',0
    27.  
    28. button db 'button',0
    29.  
    30.  
    31. .code
    32.  
    33. main:
    34.  
    35.  
    36. sub rsp,8
    37.  
    38. sub rsp,32
    39. mov rcx,0
    40. call GetModuleHandle
    41. add rsp,32
    42.  
    43.     mov wc.cbSize,sizeof WNDCLASSEX
    44.     mov wc.style,0
    45. lea rbx,wndproc
    46.     mov wc.lpfnWndProc,rbx
    47.     mov wc.cbClsExtra,0
    48.     mov wc.cbWndExtra,0
    49.     mov wc.hInstance,rax    
    50.     mov wc.hbrBackground,COLOR_BTNFACE+1
    51.     mov wc.lpszMenuName,0
    52. lea rax,name_win_class
    53.     mov wc.lpszClassName,rax
    54.     mov wc.hIcon,0
    55.     mov wc.hCursor,0
    56.     mov wc.hIconSm,0
    57.  
    58. sub rsp,32
    59. mov rcx,offset wc
    60. call RegisterClassEx
    61. add rsp,32
    62.  
    63. sub rsp,32
    64. mov rcx,0
    65. call GetModuleHandle
    66. add rsp,32
    67.  
    68.  
    69. sub rsp,96
    70.  
    71. mov rcx,0
    72. lea rdx,name_win_class
    73. lea r8,caption
    74. mov r9,WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_OVERLAPPED
    75. mov qword ptr [rsp+20h],100
    76. mov qword ptr [rsp+28h],100
    77. mov qword ptr [rsp+30h],400
    78. mov qword ptr [rsp+38h],400
    79. mov qword ptr [rsp+40h],0
    80. mov qword ptr [rsp+48h],0
    81. mov qword ptr [rsp+50h],rax
    82. mov qword ptr [rsp+58h],0
    83. call CreateWindowExA
    84.  
    85.  
    86. mov qword ptr win_desc,rax
    87.  
    88.  
    89. xor rbx,rbx
    90. mov rbx,qword ptr [wc.hInstance]
    91.  
    92. mov rcx,0
    93. lea rdx,button
    94. lea r8,caption
    95. mov r9,WS_CHILD or WS_VISIBLE or WS_BORDER or BS_PUSHBUTTON
    96. mov qword ptr [rsp+20h],100
    97. mov qword ptr [rsp+28h],100
    98. mov qword ptr [rsp+30h],30
    99. mov qword ptr [rsp+38h],30
    100. mov qword ptr [rsp+40h],rax
    101. mov qword ptr [rsp+48h],0100h
    102. mov qword ptr [rsp+50h],rbx
    103. mov qword ptr [rsp+58h],0
    104. call CreateWindowExA
    105.  
    106. add rsp,96
    107.  
    108.  
    109.  
    110. mov eax,dword ptr [win_desc]
    111. msgloop:
    112.  
    113. sub rsp,32
    114. mov rcx,offset win_msg
    115. mov rdx,rax
    116. mov r8,0
    117. mov r9,0
    118. call GetMessage
    119. add rsp,32
    120.  
    121. sub rsp,32
    122. mov rcx,offset win_msg
    123. call TranslateMessage
    124. add rsp,32
    125.  
    126. sub rsp,32
    127. mov rcx,offset win_msg
    128. call DispatchMessage
    129. add rsp,32
    130.  
    131. mov eax,dword ptr [win_desc]
    132. jmp msgloop
    133.  
    134.  
    135.  
    136.  
    137.  
    138. wndproc proc hWin   :QWORD,
    139.              uMsg   :QWORD,
    140.              wParam :QWORD,
    141.              lParam :QWORD
    142.  
    143. cmp rdx,WM_COMMAND
    144. je stop_btn
    145. jmp @F
    146.  
    147.  
    148. stop_btn:
    149. cmp r8,0100h
    150. je exit
    151.  
    152.  
    153.     cmp rdx, WM_DESTROY
    154.     jne @F
    155.  
    156. xor rcx,rcx
    157.  
    158. call ExitProcess
    159.      
    160.     @@:
    161.  
    162. sub rsp,32    
    163. call DefWindowProc
    164. add rsp,32
    165.  
    166.     ret
    167.  
    168. exit:
    169. xor rcx,rcx
    170.  
    171. call ExitProcess
    172.  
    173. wndproc endp
    174.  
    175.  
    176.  
    177. end
    178.  
    --- Сообщение объединено, 23 фев 2026 ---
    почти точно такой же код я написал и на FASM
    Код (ASM):
    1.  
    2. format PE64 GUI 5.0
    3. entry start
    4.  
    5. include 'win64a.inc'
    6.  
    7. section '.text' code readable executable
    8.  
    9.   start:
    10.         sub     rsp,8          
    11.  
    12.          
    13.        
    14. sub rsp,32
    15. mov rcx,0
    16. call [GetModuleHandle]
    17. mov  [wc.hInstance],rax
    18. add rsp,32
    19.    
    20.  
    21. sub rsp,32
    22. lea rcx,[wc]
    23. call [RegisterClassEx]
    24. add rsp,32
    25.  
    26.  
    27.    
    28.  
    29.  
    30.  
    31.       sub rsp,96
    32.  
    33.       mov rcx,0
    34.       lea rdx,[class]
    35.       lea r8,[title]
    36.       mov r9,WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_OVERLAPPED
    37.       mov qword[rsp+020h],100
    38.       mov qword[rsp+028h],100
    39.       mov qword[rsp+030h],400
    40.       mov qword[rsp+038h],400
    41.       mov qword[rsp+040h],0
    42.       mov qword[rsp+048h],0
    43.       mov rax,qword[wc.hInstance]
    44.       mov qword[rsp+050h],rax
    45.       mov qword[rsp+058h],0
    46.       call [CreateWindowEx]
    47.  
    48.        
    49.         test    rax,rax
    50.         mov qword[windesc],rax
    51.  
    52.  
    53.  
    54.  
    55.  
    56.    
    57.       mov rcx,0
    58.       lea rdx,[button]
    59.       lea r8,[caption]
    60.       mov r9,WS_CHILD or WS_VISIBLE or WS_BORDER or BS_PUSHBUTTON
    61.       mov qword[rsp+020h],100
    62.       mov qword[rsp+028h],100
    63.       mov qword[rsp+030h],60
    64.       mov qword[rsp+038h],60
    65.       mov rbx,qword[windesc]
    66.       mov qword[rsp+040h],rbx
    67.       mov qword[rsp+048h],0100h
    68.       mov rax,qword[wc.hInstance]
    69.       mov qword[rsp+050h],rax
    70.       mov qword[rsp+058h],0
    71.       call [CreateWindowEx]
    72. add rsp,96
    73.  
    74.  
    75.   msg_loop:
    76.   mov rax,qword[windesc]
    77.         invoke  GetMessage,msg,rax,0,0
    78.         invoke  TranslateMessage,msg
    79.         invoke  DispatchMessage,msg
    80.         jmp     msg_loop
    81.  
    82.  
    83.  
    84.  
    85. proc WindowProc hwnd,wmsg,wparam,lparam
    86.  
    87.         cmp rdx,WM_COMMAND
    88.         je stop_btn
    89.         jmp next
    90.  
    91. stop_btn:
    92. cmp r8,100h
    93. je the_end
    94.  
    95.  
    96. the_end:
    97. invoke ExitProcess,0
    98.  
    99.  
    100. next:
    101.         cmp     edx,WM_DESTROY
    102.         je      .wmdestroy
    103.   .defwndproc:
    104.  
    105.         invoke  DefWindowProc,rcx,rdx,r8,r9
    106.         jmp     .finish
    107.   .wmdestroy:
    108.      xor rcx,rcx
    109.      invoke ExitProcess,0
    110.  
    111.   .finish:
    112.         ret
    113.  
    114. endp
    115.  
    116. section '.data' data readable writeable
    117.  
    118.   title db 'Win64',0
    119.   class db 'FASMWIN64',0
    120.   button db 'button',0
    121.   caption db 'btn',0
    122.   windesc rq 1
    123.   wc WNDCLASSEX sizeof.WNDCLASSEX,0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,class,NULL
    124.  
    125.   msg MSG
    126.  
    127. section '.idata' import data readable writeable
    128.  
    129.   library kernel32,'KERNEL32.DLL',\
    130.           user32,'USER32.DLL'
    131.  
    132.   include 'api\kernel32.inc'
    133.   include 'api\user32.inc'
    134.  
    --- Сообщение объединено, 23 фев 2026 ---
    я это к тому что компилятор ML64 что то от себя добавляет,либо же это компоновщик делает
     
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.647
    Entropy, в масм надо добавить option prologue:none
     
  9. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    M0rg0t, с option prologue:none не работает
    Код (ASM):
    1.  
    2. option casemap:none
    3. ;option prologue:none
    4. ;option epilogue:none
    5.  
    6.  
    7.  
    8. include win64.inc
    9. include user32.inc
    10. include kernel32.inc
    11.  
    12.  
    13. includelib w64prj\lib64\kernel32.lib
    14. includelib w64prj\lib64\user32.lib
    15.  
    16.  
    17.  
    18. public main
    19.  
    20. .data
    21.  
    22. win_msg MSG <>
    23. wc WNDCLASSEX <>
    24. win_desc dword ?
    25. btn_desc dword ?
    26.  
    27. name_win_class db 'wclass',0
    28. caption db 'btn',0
    29.  
    30. button db 'button',0
    31.  
    32.  
    33. .code
    34.  
    35. main:
    36.  
    37.  
    38. sub rsp,8
    39.  
    40. sub rsp,32
    41. mov rcx,0
    42. call GetModuleHandle
    43.  
    44.  
    45.     mov wc.cbSize,sizeof WNDCLASSEX
    46.     mov wc.style,0
    47. lea rbx,wndproc
    48.     mov wc.lpfnWndProc,rbx
    49.     mov wc.cbClsExtra,0
    50.     mov wc.cbWndExtra,0
    51.     mov wc.hInstance,rax    
    52.     mov wc.hbrBackground,COLOR_BTNFACE+1
    53.     mov wc.lpszMenuName,0
    54. lea rax,name_win_class
    55.     mov wc.lpszClassName,rax
    56.     mov wc.hIcon,0
    57.     mov wc.hCursor,0
    58.     mov wc.hIconSm,0
    59.  
    60.  
    61. mov rcx,offset wc
    62. call RegisterClassEx
    63.  
    64.  
    65.  
    66. mov rcx,0
    67. call GetModuleHandle
    68.  
    69.  
    70.  
    71. sub rsp,96
    72.  
    73. mov rcx,0
    74. lea rdx,name_win_class
    75. lea r8,caption
    76. mov r9,WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_OVERLAPPED
    77. mov qword ptr [rsp+20h],100
    78. mov qword ptr [rsp+28h],100
    79. mov qword ptr [rsp+30h],400
    80. mov qword ptr [rsp+38h],400
    81. mov qword ptr [rsp+40h],0
    82. mov qword ptr [rsp+48h],0
    83. mov qword ptr [rsp+50h],rax
    84. mov qword ptr [rsp+58h],0
    85. call CreateWindowExA   ;с option prologue:none здесь падает в RIP неверный адрес
    86.  
    87.  
    88. mov qword ptr win_desc,rax
    89.  
    90.  
    91. xor rbx,rbx
    92. mov rbx,qword ptr [wc.hInstance]
    93.  
    94. mov rcx,0
    95. lea rdx,button
    96. lea r8,caption
    97. mov r9,WS_CHILD or WS_VISIBLE or WS_BORDER or BS_PUSHBUTTON
    98. mov qword ptr [rsp+20h],100
    99. mov qword ptr [rsp+28h],100
    100. mov qword ptr [rsp+30h],30
    101. mov qword ptr [rsp+38h],30
    102. mov qword ptr [rsp+40h],rax
    103. mov qword ptr [rsp+48h],0100h
    104. mov qword ptr [rsp+50h],rbx
    105. mov qword ptr [rsp+58h],0
    106. call CreateWindowExA
    107. add rsp,96
    108.  
    109.  
    110.  
    111. mov eax,dword ptr [win_desc]
    112. msgloop:
    113.  
    114.  
    115. mov rcx,offset win_msg
    116. mov rdx,rax
    117. mov r8,0
    118. mov r9,0
    119. call GetMessage
    120.  
    121.  
    122.  
    123. mov rcx,offset win_msg
    124. call TranslateMessage
    125.  
    126.  
    127. mov rcx,offset win_msg
    128. call DispatchMessage
    129.  
    130.  
    131. mov eax,dword ptr [win_desc]
    132. jmp msgloop
    133.  
    134.  
    135.  
    136.  
    137.  
    138. wndproc proc hWin   :QWORD,
    139.              uMsg   :QWORD,
    140.              wParam :QWORD,
    141.              lParam :QWORD
    142.  
    143. cmp rdx,WM_COMMAND
    144. je stop_btn
    145. jmp @F
    146.  
    147.  
    148. stop_btn:
    149. cmp r8,0100h
    150. je exit
    151.  
    152.  
    153.     cmp rdx, WM_DESTROY
    154.     jne @F
    155.  
    156. xor rcx,rcx
    157.  
    158. call ExitProcess
    159.      
    160.     @@:
    161.  
    162. sub rsp,32    
    163. call DefWindowProc
    164. add rsp,32
    165.  
    166.     ret
    167.  
    168. exit:
    169. xor rcx,rcx
    170.  
    171. call ExitProcess
    172.  
    173. wndproc endp
    174.  
    175.  
    176.  
    177. end
     
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.647
    Entropy, у меня код работает при сборке масм64 от Хатча

    ML64 test.asm
    LINK test.obj" /SUBSYSTEM:WINDOWS /ENTRY:main

    Код (ASM):
    1. include \masm32\include64\masm64rt.inc
    2.  
    3. public main
    4. .data
    5. win_msg MSG <>
    6. wc WNDCLASSEX <>
    7. win_desc dword ?
    8. btn_desc dword ?
    9. name_win_class db 'wclass',0
    10. caption db 'btn',0
    11. button1 db 'button',0
    12. .code
    13. main:
    14. sub rsp,8
    15. sub rsp,32
    16. mov rcx,0
    17. call GetModuleHandle
    18. add rsp,32
    19.     mov wc.cbSize,sizeof WNDCLASSEX
    20.     mov wc.style,0
    21. lea rbx,wndproc
    22.     mov wc.lpfnWndProc,rbx
    23.     mov wc.cbClsExtra,0
    24.     mov wc.cbWndExtra,0
    25.     mov wc.hInstance,rax  
    26.     mov wc.hbrBackground,COLOR_BTNFACE+1
    27.     mov wc.lpszMenuName,0
    28. lea rax,name_win_class
    29.     mov wc.lpszClassName,rax
    30.     mov wc.hIcon,0
    31.     mov wc.hCursor,0
    32.     mov wc.hIconSm,0
    33. sub rsp,32
    34. mov rcx,offset wc
    35. call RegisterClassEx
    36. add rsp,32
    37. sub rsp,32
    38. mov rcx,0
    39. call GetModuleHandle
    40. add rsp,32
    41. sub rsp,96
    42. mov rcx,0
    43. lea rdx,name_win_class
    44. lea r8,caption
    45. mov r9,WS_VISIBLE or WS_CAPTION or WS_SYSMENU or WS_OVERLAPPED
    46. mov qword ptr [rsp+20h],100
    47. mov qword ptr [rsp+28h],100
    48. mov qword ptr [rsp+30h],400
    49. mov qword ptr [rsp+38h],400
    50. mov qword ptr [rsp+40h],0
    51. mov qword ptr [rsp+48h],0
    52. mov qword ptr [rsp+50h],rax
    53. mov qword ptr [rsp+58h],0
    54. call CreateWindowExA
    55. mov qword ptr win_desc,rax
    56. xor rbx,rbx
    57. mov rbx,qword ptr [wc.hInstance]
    58. mov rcx,0
    59. lea rdx,button1
    60. lea r8,caption
    61. mov r9,WS_CHILD or WS_VISIBLE or WS_BORDER or BS_PUSHBUTTON
    62. mov qword ptr [rsp+20h],100
    63. mov qword ptr [rsp+28h],100
    64. mov qword ptr [rsp+30h],30
    65. mov qword ptr [rsp+38h],30
    66. mov qword ptr [rsp+40h],rax
    67. mov qword ptr [rsp+48h],0100h
    68. mov qword ptr [rsp+50h],rbx
    69. mov qword ptr [rsp+58h],0
    70. call CreateWindowExA
    71. add rsp,96
    72. mov eax,dword ptr [win_desc]
    73. msgloop:
    74. sub rsp,32
    75. mov rcx,offset win_msg
    76. mov rdx,rax
    77. mov r8,0
    78. mov r9,0
    79. call GetMessage
    80. add rsp,32
    81. sub rsp,32
    82. mov rcx,offset win_msg
    83. call TranslateMessage
    84. add rsp,32
    85. sub rsp,32
    86. mov rcx,offset win_msg
    87. call DispatchMessage
    88. add rsp,32
    89. mov eax,dword ptr [win_desc]
    90. jmp msgloop
    91. wndproc proc hWin   :QWORD,
    92.              uMsg   :QWORD,
    93.              wParam :QWORD,
    94.              lParam :QWORD
    95. cmp rdx,WM_COMMAND
    96. je stop_btn
    97. jmp @F
    98. stop_btn:
    99. cmp r8,0100h
    100. je exit
    101.     cmp rdx, WM_DESTROY
    102.     jne @F
    103. xor rcx,rcx
    104. call ExitProcess
    105.    
    106.     @@:
    107. sub rsp,32  
    108. call DefWindowProc
    109. add rsp,32
    110.     ret
    111. exit:
    112. xor rcx,rcx
    113. call ExitProcess
    114. wndproc endp
    115. end
     
  11. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    M0rg0t, я использовал компилятор из WinDDK For Windows 7
     
  12. miilalex

    miilalex Member

    Публикаций:
    0
    Регистрация:
    8 сен 2024
    Сообщения:
    45
    мимо проходя, я бы предложил каждый скомпилированный .obj из своего исходника на ассемблере скормить IDA и посмотреть, что Ида в нем найдет с точки зрения кода и сегментов.

    это в равной степени касается и работающих и не работающих после link-а в exe

    цель - выявить отличия дефолтных результатов компиляции того и другого инструмента

    потому что подбирать конкретный компилятор из конкретного пакета, чтобы собралось нечто, способное запуститься, это буквально билет в один конец.
    более практично выяснить, что конкретно меняется в генерации исполняемого кода и атрибутах сегментов в объектном файле, и по мере обнаружения неправильно по умолчанию работающих компиляторов искать в их опциях те, которые влияют на требуемые свойства кода и атрибутов.
     
    R81... нравится это.
  13. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    попытался сделать диалоговое модальное окно,не работает,окно не появляется
    Код (ASM):
    1.  
    2. option casemap:none
    3.  
    4.  
    5.  
    6. include win64.inc
    7. include user32.inc
    8. include kernel32.inc
    9. include shell32.inc
    10.  
    11. includelib w64prj\lib64\kernel32.lib
    12. includelib w64prj\lib64\user32.lib
    13. includelib w64prj\lib64\shell32.lib
    14.  
    15.  
    16. public main
    17.  
    18. .data
    19.  
    20.  
    21.  
    22. .code
    23.  
    24. main:
    25.  
    26. sub rsp,8
    27. sub rsp,32
    28.  
    29. mov rcx,0
    30. call GetModuleHandle
    31.  
    32.  
    33.  
    34. mov rcx,rax
    35. mov rdx,100h
    36. mov r8,HWND_DESKTOP
    37. mov r9,offset wndproc
    38. mov qword ptr [rsp+32],0
    39. call DialogBoxParam
    40.  
    41.  
    42.  
    43. wndproc proc hwnd:qword,umsg:qword,wparam:qword,lparam:qword
    44.            
    45. cmp rdx,WM_CLOSE        
    46. je @f          
    47. cmp rdx,WM_INITDIALOG
    48. je process_in_sleep
    49.  
    50.  
    51.  
    52. @@:
    53.  
    54. xor rcx,rcx
    55.  
    56. call ExitProcess
    57.  
    58. process_in_sleep:
    59.  
    60. sub rsp,32
    61. mov rcx,5000
    62. call Sleep
    63. add rsp,32
    64.  
    65. xor rax,rax
    66.  
    67. ret
    68.  
    69. wndproc endp
    70.  
    71.  
    72.  
    73. end
    74.  
    файл ресурсов

    Код (Text):
    1. #define ID_DIALOG 0x100
    2. #define WS_CAPTION 0x0C00000
    3. #define WS_VISIBLE 0x10000000
    4. #define WS_SYSMENU 0x80000
    5. #define DS_CENTER 0x800
    6. #define WS_MINIMIZEBOX 0x20000
    7.  
    8. ID_DIALOG DIALOG  0,0,130,130
    9. STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX
    10. CAPTION "DialogBox"
    11.  
    12. BEGIN
    13.    CTEXT "DialogBox",1, 20,60,80,12, WS_VISIBLE
    14. END
    15.  
    16.  
    --- Сообщение объединено, 4 мар 2026 в 16:06 ---
    miilalex, изначально в пакете masm64 компилятора ml64 нет,вот приходится брать его из WinDDK
     
    Последнее редактирование: 4 мар 2026 в 16:06
  14. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    4.205
    Entropy,
    я спрашивал об этом у Steve Hutchesson, он ответил, что не хочет связываться с юристами Майкрософта. Но не официально можно распотрошить Visual Studio
     
  15. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.647
    так я скопировал masm64 с какой-то студии (вроде с 2015) и все робит
     
    Mikl___ нравится это.
  16. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    Мне интересно инклуды вы где брали - в SDK MASM64 от Steve Hutchesson или в SDK MASM32? Просто, вспомнил ваш пост в каком-то треде, где вы писали, что инклуды для Visual Studio можно брать из SDK MASM32.
     
    Последнее редактирование: 5 мар 2026 в 03:40
  17. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    105
    Еще бы работало. Он вообще не програмист. Здесь без иды все понятно.

    2026-03-05_03-56-45.png
     
  18. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    400
    Steve Hutchesson и Stephen Hutchesson даже, вроде и пишется по-разному. Или вы пошутить решили?
     
  19. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    105
    Это все потому что он чорный?
     
  20. Entropy

    Entropy Member

    Публикаций:
    0
    Регистрация:
    23 авг 2020
    Сообщения:
    255
    тогда,любой мой написанный код на ассемблере не должен работать вообще,потому он не программист
    --- Сообщение объединено, 5 мар 2026 в 10:31 ---
    CaptainObvious, да,он не программист
     

    Вложения:

    • stv.PNG
      stv.PNG
      Размер файла:
      330,5 КБ
      Просмотров:
      31
Статус темы:
Закрыта.