Макрос MASM32

Тема в разделе "WASM.BEGINNERS", создана пользователем TrashGen, 29 апр 2011.

  1. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.201
    Адрес:
    подполье
    Здравствуйте. Не поможете пожалуйста в составлении макроса?

    имеем вызов функции типа
    Код (Text):
    1. push arg_apiN
    2. push arg_api2
    3. push arg_api1;тут идут аргументы реальной винапи от ..., до ...
    4. push arg_apiN ;количество агрументов у винапи
    5. push offset APINAME ;тут адрес винапи
    6. call esi ;тут моя функция, скажем адрес всегда будет в esi
    7. add esp,arg_No ;сишный вызов - выравниваем стек
    8.  
    9. писать это довольно объёмно и хочу спросить можно ли сделать макрос вида
    10. например:
    11. MYCALL MessageBox,0,offset _1,offset _2,10h
    12.  
    13. который сгенерирует такой кодес
    14. push 10h
    15. push offset _2
    16. push offset _1
    17. push 0 ;аргументы
    18. push 4 ;количество агрументов у винапи
    19. push offset MessageBox ;тут адрес винопи
    20. call esi ;тут моя функция всегда, скажем в esi
    21. add esp,6*4 ;сишный вызов - выравниваем стек
    22.  
    23. не отправляйте пожалуйста в COMMERCE/
     
  2. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    TrashGen
    Если разобрать MessageBox, то видно что функция заканчивается на RETN 16, так как у MessageBox всегда 4 параметра, и получает она свои аргументы через стек, то есть ближайший параметр hWnd, далее lpText, далее lpCaption и последний uType, и никак не иначе, т.е. стек программа выровняет сама, а адрес процедуры можно передать через MOV
    push 10h
    push offset _2
    push offset _1
    push 0 ;аргументы
    mov si,offset MessageBox ;тут адрес функции
    call esi
     
  3. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.201
    Адрес:
    подполье
    да это все понятно, но мне вот как раз надо так как я выше описал, то есть это какбэ лишь обертка для ВинАпи(по идее для любой вроде как), у нее есть внутри свой функционал
     
  4. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    TrashGen
    А чем вот такой порядок не устроит
    MYCALL 0,offset _1,offset _2,10h,MessageBox
    который сгенерирует
    Код (Text):
    1. mov si,offset MessageBox
    2. push 10h
    3. push offset _2
    4. push offset _1
    5. push 0 ;аргументы
    6. call esi ;тут моя функция всегда, скажем в esi
     
  5. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.201
    Адрес:
    подполье
    Mikl___
    в esi адрес функции обертки, ей передается адрес ВинАпи(МессаджБокс в данном случае), количество ее параметров и сами параметры, тоесть call esi не мессаджбокс вызывает
     
  6. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    остается только узнать, как вы будете вызывать функцию через имя - поиском в импорте? для LoadLibrary - GetProcAddress надо еще знать из какой длл вы апи хотите вызвать. А если скомпилировано через такой макрос - у вас и в импорте не будет этих функций...

    Дописываем и превращаем в то, что надо?
    Код (Text):
    1.    MyCall MACRO name:REQ,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12, \
    2.    p13,p14,p15,p16,p17,p18,p19,p20,p21,p22
    3.       LOCAL lbl, APIName
    4.       jmp lbl
    5.          APIName db name,0
    6.       lbl:
    7.  
    8.    ;; ---------------------------------------
    9.    ;; loop through arguments backwards, push
    10.    ;; NON blank ones and call the function.
    11.    ;; ---------------------------------------
    12.  
    13.       FOR arg,<p22,p21,p20,p19,p18,p17,p16,p15,p14,p13,\
    14.       p12,p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1>
    15.         IFNB <arg>    ;; If not blank
    16.           push arg    ;; push parameter
    17.         ENDIF
    18.       ENDM
    19.       push offset APIName
    20.       call esi
    21.     ENDM
    Вызывать
    MyCall "MessageBox", 0, offset _1, offset _2, 10h

    Должно работать. А, там еще количество аргументов, на которые стек править - допишите?
     
  7. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    TrashGen
    макросу всё равно, какое имя ты передаешь и в каком порядке
    Код (Text):
    1. macro MYCALL4 Fn,arg1,arg2,arg3,arg4
    2. mov si,offset Fn
    3. push arg4
    4. push arg3
    5. push arg2
    6. push arg1
    7. call si
    8. endm
     
  8. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.201
    Адрес:
    подполье
    FatMoon
    ну уж, найдем какнить функции то:)
    спасибо вам
    Mikl___
    вам также спасибо
     
  9. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    А чем инвовк не нравится?
    Код (Text):
    1. cfunc TYPEDEF PROTO C :VARARG
    2. pcfunc TYPEDEF PTR cfunc
    3. invoke pcfunc ptr esi,eax,ecx,edx,edi
     
  10. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.585
    В конференции участник под ником carlos написал вариант кода. Надеюсь, никто не против, если я его скопирую сюда - может еще кому пригодится:

    Код (Text):
    1. cdecl macro name1, varargs:vararg
    2. countargs   =   0
    3. for arg, <varargs>
    4. countargs   =   countargs + 1
    5. push    arg
    6. endm
    7. call    name1
    8. countargs   =   countargs * 4
    9. add     esp, countargs
    10. EndM