FASM Прикрутить кнопку на стандартное окно...

Тема в разделе "WASM.BEGINNERS", создана пользователем rococo795, 16 дек 2016.

  1. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Код (ASM):
    1. mov ebx,eax
    2.     mov edi,msg1+4
    3.     mov ecx,32
    4. @@: shl ebx,1
    5.     adc byte [edi],0
    6.     inc edi
    7.     loop @b
    8.     invoke wsprintfA,buff,msg1, eax,eax
    9.     invoke MessageBoxA,0, buff, msg2, 0
    10.  
    11.     msg1 db "eax=00000000000000000000000000000000b",10,"eax=%d",10, "eax=%08Xh",0
    12.     msg2 db "По этому смещению ошибка",0
    13.     buff db 50 DUP(?)
    Таким способом (который посоветовал мне один грамотный человек, которого Вы все знаете) вывожу значение регистра в мессагебокс.
    Есть ли возможность прикрутить к этому окошку на котором есть кнопка "ОК", ещё одну кнопку "Завершение программы", которая будет ссылаться на .exit:?
     
    Последнее редактирование модератором: 14 ноя 2018
  2. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Также можно перехватить создание мсжбокса и заменить текст на кнопке.
     
  4. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    да как же плохо, когда жмёшь на ник - вылазит окошко ненужное....!!!
    _edge

    Thetrik


    Спасибо.... попробую...
     
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Код (ASM):
    1. format PE GUI
    2. include 'win32ax.inc'
    3. ; import, code and data in the same section
    4.    mov eax,12345
    5.    sub esp,80; buffer for wsprintf and MessageBox
    6.    mov esi,esp
    7.    push eax eax
    8.    or eax,eax
    9.    jz a0  
    10.    bsr ecx,eax
    11.    inc ecx
    12.    mov edx,fmt+35
    13.    sub edx,ecx
    14. @@:shr eax,1
    15.    adc byte [edx+ecx],0
    16.    loop @r
    17. a0:  invoke wsprintf,esi,fmt
    18.    invoke MessageBox,NULL,esi,wTitle,MB_OK
    19.    add esp,4*4+80;params for wsprintf and buffer
    20.    invoke ExitProcess,0
    21. wTitle  db   'rococo',0
    22. fmt db "eax=00000000000000000000000000000000b",10,"eax=%d",10, "eax=%08Xh",0
    23. data import
    24.  library user32,'USER32.DLL',\
    25.          kernel32,'kernel32.dll'
    26.  import user32,\
    27.         wsprintf,  'wsprintfA',\
    28.         MessageBox,'MessageBoxA'
    29.  import kernel32,\
    30.         ExitProcess,'ExitProcess'
    31. end data
    [​IMG]
     

    Вложения:

    • 01.png
      01.png
      Размер файла:
      23,1 КБ
      Просмотров:
      2.285
    Последнее редактирование: 17 дек 2016
  6. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    в таком случае нужно использовать не MessageBox а SoftModalMessageBox
    Функция SoftModalMessageBox создает, отображает и оперирует окном сообщений. Окно сообщений содержит определяемый программой текст сообщения и заголовок, любую пиктограмму, и любую комбинацию предопределенных командных кнопок, любое количество кнопок и любые надписи на кнопках.
    Синтаксис
    Код (C):
    1. int SoftModalMessageBox
    2. (
    3.     LPMSGBOXDATA lpMsgBoxData   // адрес структуры для параметров
    4.             // окна сообщений
    5. );
    Параметры
    lpMsgBoxData
    Указатель на структуру MSGBOXDATA, которая содержит информацию, используемую для показа на экране окна сообщений.
    Код (ASM):
    1.  
    2. MSGBOXPARAMSA STRUCT
    3.   cbSize                DWORD      ?;размер структуры
    4.   hwndOwner             DWORD      ?;
    5.   hInstance             DWORD      ?;
    6.   lpszText              DWORD      ?;адрес текста в окне сообщений
    7.   lpszCaption           DWORD      ?;адрес заголовка в окне сообщений
    8.   dwStyle               DWORD      ?;
    9.   lpszIcon              DWORD      ?;
    10.   dwContextHelpId       DWORD      ?;
    11.   lpfnMsgBoxCallback    DWORD      ?;
    12.   dwLanguageId          DWORD      ?;идентификатор языка
    13. MSGBOXPARAMSA ENDS
    14.  
    15. MSGBOXDATA struct      
    16.      params              MSGBOXPARAMSA <>
    17.      pwndOwner           DWORD ?
    18.      wLanguageId         DWORD ?
    19.      pidButton           DWORD ?         ; // Array of button IDs
    20.      ppszButtonText      DWORD ?         ; // Array of button text strings
    21.      cButtons            DWORD ?
    22.      DefButton           DWORD ?
    23.      CancelId            DWORD ?
    24.      Timeout             DWORD ?
    25. MSGBOXDATA ends
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Тогда уж MessageBoxIndirect(). По ней хотя бы инфу в мсдн почитать можно :)
     
  8. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    Вроде и я из MSDN перевод про SoftModalMessageBox сделал :)
     
  9. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Mikl___
    rmn

    Спасибо... Сёдня суббота - всем в баньку!!!
     
  10. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    invoke MessageBoxA,0,textA,titl,0
    textA db 'МанА манА ты тынц ты ры ры...',0

    Вот так всё работает окейно...

    а вот так - не работает.... совсэем этот асм меня не уважает..

    mov textA,$27
    mov textA+1,$53
    mov textA+2,$54
    mov textA+3,$4F
    mov textA+4,$50
    mov textA+5,$27
    mov textA+6,$2c
    mov textA+7,$00

    invoke MessageBoxA,0,textA,titl,0

    почему этот наглый мессагебокс тут совсем не уважает textA
    ведь символы то я правильные положил или нет?
     
  11. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.797
    rococo795,
    используй квадратные скобки
    Код (ASM):
    1. mov [textA+1],0x53
    а для чего так сложно?:preved:
    вот так нельзя?
    Код (ASM):
    1. mov dword[textA],4F545327h
    2. mov dword[textA+4],2C2750h
    или так
    Код (ASM):
    1. mov dword[textA],"'STO"
    2.     mov dword[textA+4],"P',"
     
  12. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Да ложил я это всё и в адрес памяти (в скобках).. чё то не компилилось.... щас попробую...
     
  13. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    ФУ ТЫ НУ ТЫ!! Заработало!!! Уж не помню что было в моих строчках - но не работало... а скобки кавадратные были это точно..... вполне возможно я от щедрости души вставлял эти скобки и в инвоке!!!

    Mikl___

    А есть что нибудь вообще - чего Вы не знаете? )))
     
    Alexey нравится это.
  14. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Mikl__, вероятно структура изменилась, поскольку с такой декларацией падает когда либа обращается к списку строк для кнопок, и попадает на количество кнопок, т.е. получается что поля сдвинуты на один dword. Небольшой реверс показал что на Win7 x64 резервируется структура размером 0x60 байт, в итоге получилась такая структура:
    Код (ASM):
    1. format PE GUI 4.0
    2.  
    3. entry main
    4.  
    5. include 'win32wx.inc'
    6.  
    7. struct MSGBOXDATA
    8.   params              MSGBOXPARAMS <>
    9.   dwunk               dd ?
    10.   pwndOwner           dd ?
    11.   wLanguageId         dd ?
    12.   pidButton           dd ?         ; // Array of button IDs
    13.   ppszButtonText      dd ?         ; // Array of button text strings
    14.   cButtons            dd ?
    15.   DefButton           dd ?
    16.   CancelId            dd ?
    17.   Timeout             dd ?
    18.   unk2                dd 5 dup (?)
    19. ends
    20.  
    21. section '.idata' import data readable writeable
    22.  
    23. library kernel, 'kernel32.dll', \
    24.         user, 'user32.dll'
    25.  
    26. import kernel,\
    27.        ExitProcess, 'ExitProcess'
    28. import user,\
    29.        SoftModalMessageBox, 'SoftModalMessageBox'
    30.  
    31.  
    32. section '.text' code readable executable writable
    33.  
    34. sCaption du 'Extended Message Box', 0
    35. sTitle du 'Hello!', 0
    36. sBTN1 du 'Of course',0
    37. sBTN2 du 'Nope',0
    38. sBTN3 du 'Probably...',0
    39. sBTN4 du 'Maybe...',0
    40.  
    41. dwBtnIds  dd 1,2,3,4
    42. dwTxtTbl  dd sBTN1, sBTN2, sBTN3, sBTN4
    43.  
    44. mbxData  MSGBOXDATA <sizeof.MSGBOXPARAMS, 0, 0, sTitle, sCaption, MB_YESNOCANCEL OR MB_ICONWARNING, 0, 0, 0, 0>, \
    45.                     0, 0, 0, dwBtnIds, dwTxtTbl, 4, 0, 2, -1
    46.  
    47. proc main
    48.  
    49.     invoke SoftModalMessageBox, mbxData
    50.     invoke ExitProcess, 0
    51.  
    52. endp          
    [​IMG]
    Назначение неизвестных полей не смотрел, да мне и не надо.
     
    Mikl___ нравится это.
  15. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    а теперь на вин XP падает.... так и должно?
     
  16. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ну так я дал пример для Win7 x64. Вообще для новых систем начиная с Vista нужно юзать TaskDialogIndirect для кастомных диалоговых окон.
     
    Mikl___ нравится это.
  17. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Понял..
     
  18. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    invoke CreateFile,lpFileIn,GENERIC_READ,0,0,3,0,0

    lpFileIn db 'C:\1\01.mts',0
    lpFileIn2 db 'C:\1\02.mts',0
    lpFileIn3 db 'C:\1\03.mts',0
    lpFileIn4 db 'C:\1\04.mts',0
    lpFileIn5 db 'C:\1\05.mts',0
    lpFileIn6 db 'C:\1\06.mts',0
    lpFileIn7 db 'C:\1\07.mts',0
    lpFileIn8 db 'C:\1\08.mts',0
    lpFileIn9 db 'C:\1\09.mts',0
    lpFileInA db 'C:\1\10.mts',0

    После инвоке идёт открывание файла первого, размер находим, память выделяем, загружаем в память открытый файл, закрываем его и записываю его в новый файл.... если тупо повторить все строчки и в инвоку указать lpFileIn2 .. - то всё работает без проблем....
    а зачем мне эти ненужные много строк для 10 файлов.... ?

    mov [lpFileIn+7],$02
    sub esi,1
    cmp esi,0
    ja .cikl

    хочу вот так открыть второй файл - не хочет открывать??? как в первую строчку положить путь ко второму файлу?
     
  19. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Юзай теги.
    По теме - если я правильно понял твою задачу то ты записываешь цифру 2, а нужно записывать символ 2.
    Код (ASM):
    1. mov [lpFileIn+6],'2'
    Для 10 сам проверку сделай.
     
  20. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    236
    Thetrik

    Это работает... но интерисует чтоб именно шестнадцатиричные данные ложить, чтоб в цикле потом прибавлять по единице... так нельзя?