Здравствуйте. Не поможете пожалуйста в составлении макроса? имеем вызов функции типа Code (Text): push arg_apiN push arg_api2 push arg_api1;тут идут аргументы реальной винапи от ..., до ... push arg_apiN ;количество агрументов у винапи push offset APINAME ;тут адрес винапи call esi ;тут моя функция, скажем адрес всегда будет в esi add esp,arg_No ;сишный вызов - выравниваем стек писать это довольно объёмно и хочу спросить можно ли сделать макрос вида например: MYCALL MessageBox,0,offset _1,offset _2,10h который сгенерирует такой кодес push 10h push offset _2 push offset _1 push 0 ;аргументы push 4 ;количество агрументов у винапи push offset MessageBox ;тут адрес винопи call esi ;тут моя функция всегда, скажем в esi add esp,6*4 ;сишный вызов - выравниваем стек не отправляйте пожалуйста в COMMERCE/
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
да это все понятно, но мне вот как раз надо так как я выше описал, то есть это какбэ лишь обертка для ВинАпи(по идее для любой вроде как), у нее есть внутри свой функционал
TrashGen А чем вот такой порядок не устроит MYCALL 0,offset _1,offset _2,10h,MessageBox который сгенерирует Code (Text): mov si,offset MessageBox push 10h push offset _2 push offset _1 push 0 ;аргументы call esi ;тут моя функция всегда, скажем в esi
Mikl___ в esi адрес функции обертки, ей передается адрес ВинАпи(МессаджБокс в данном случае), количество ее параметров и сами параметры, тоесть call esi не мессаджбокс вызывает
остается только узнать, как вы будете вызывать функцию через имя - поиском в импорте? для LoadLibrary - GetProcAddress надо еще знать из какой длл вы апи хотите вызвать. А если скомпилировано через такой макрос - у вас и в импорте не будет этих функций... Дописываем и превращаем в то, что надо? Code (Text): MyCall MACRO name:REQ,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12, \ p13,p14,p15,p16,p17,p18,p19,p20,p21,p22 LOCAL lbl, APIName jmp lbl APIName db name,0 lbl: ;; --------------------------------------- ;; loop through arguments backwards, push ;; NON blank ones and call the function. ;; --------------------------------------- FOR arg,<p22,p21,p20,p19,p18,p17,p16,p15,p14,p13,\ p12,p11,p10,p9,p8,p7,p6,p5,p4,p3,p2,p1> IFNB <arg> ;; If not blank push arg ;; push parameter ENDIF ENDM push offset APIName call esi ENDM Вызывать MyCall "MessageBox", 0, offset _1, offset _2, 10h Должно работать. А, там еще количество аргументов, на которые стек править - допишите?
TrashGen макросу всё равно, какое имя ты передаешь и в каком порядке Code (Text): macro MYCALL4 Fn,arg1,arg2,arg3,arg4 mov si,offset Fn push arg4 push arg3 push arg2 push arg1 call si endm
А чем инвовк не нравится? Code (Text): cfunc TYPEDEF PROTO C :VARARG pcfunc TYPEDEF PTR cfunc invoke pcfunc ptr esi,eax,ecx,edx,edi
В конференции участник под ником carlos написал вариант кода. Надеюсь, никто не против, если я его скопирую сюда - может еще кому пригодится: Code (Text): cdecl macro name1, varargs:vararg countargs = 0 for arg, <varargs> countargs = countargs + 1 push arg endm call name1 countargs = countargs * 4 add esp, countargs EndM