News:

Masm32 SDK description, downloads and other helpful links
Message to All Guests
NB: Posting URL's See here: Posted URL Change

Main Menu

invoking an offset procedure

Started by LordAdef, January 14, 2025, 04:19:06 AM

Previous topic - Next topic

LordAdef

Hi guys,

I've got a struct, and I saved a proc offset in order to call it:
mov foo.init, offset blablabla

All is good and I can call the proc:
call foo.init

But I want to use invoke and send values. Prototyping the proc doesn't help:
invoke foo.init, 12, 34, 23

Any ideas?
Cheers
Alex

ps: I re-introduced myself in the welcome forum

Villuy

invoke must have name of proc to check params. No way.

Vortex

Hi LordAdef,

You can try this one :

.386
.model flat,stdcall
option casemap:none

include     \masm32\include\windows.inc
include     \masm32\include\kernel32.inc
includelib  \masm32\lib\kernel32.lib

.data

user32      db 'user32.dll',0
function    db 'MessageBoxA',0
caption     db 'Hello!',0
message     db 'MessageBoxA called via pointer',0

.data?

hLib dd ?
pMessageBox dd ?

.code

start:

    invoke  LoadLibrary,ADDR user32
    mov     hLib,eax

    invoke  GetProcAddress,eax,ADDR function
    mov     pMessageBox,eax

    mov     edx,pMessageBox
    invoke  pr4 PTR edx,0,ADDR message,\
            ADDR caption,0
           
    invoke  FreeLibrary,hLib
    invoke  ExitProcess,0

END start

    mov     edx,pMessageBox
    invoke  pr4 PTR edx,0,ADDR message,\
            ADDR caption,0

edx holds the pointer to MessageBoxA, you can specify the prX macro to call a function through a register.

Reading \masm32\include\windows.inc :

    ArgCount MACRO number
      LOCAL txt
      txt equ <typedef PROTO :DWORD>
        REPEAT number - 1
          txt CATSTR txt,<,:DWORD>
        ENDM
      EXITM <txt>
    ENDM

    pr0  typedef PROTO
    pr1  ArgCount(1)
    pr2  ArgCount(2)
   .
   .
    pr24 ArgCount(24)
    pr25 ArgCount(25)

If you want to call a function taking three parameters :

invoke  pr3 PTR ecx,param1,param2,param3

fearless

Declare your struct with defined pointers, which point to prototypes, like so:

Foo_Init_Proto TYPEDEF PROTO dwParam1:DWORD, dwParam2:DWORD, dwParam3:DWORD

Foo_Init_Ptr TYPEDEF PTR Foo_Init_Proto

Foo STRUCT
    Init Foo_Init_Ptr 0
Foo ENDS

Then

Invoke Foo.Init, 1, 2, 3
or

lea ebx, Foo
Invoke [ebx].Foo.Init, 1, 2, 3

Also, remember to update the Foo struct with address of Init at run time,  before calling it, or you can try setting it to an offset at compile time (not tried that myself)

LordAdef

Hi Fearless,

It worked beautifully!!!

Thank you so much. Saved the day!

Thanks everyone for chiming in too!

fearless

Nice! did u use an offset at compile time to point to a function (offset to proc), or did u update the struct at runtime with the address of function?:


lea eax, FuncInit
mov Foo.Init, eax

LordAdef

Quote from: fearless on January 14, 2025, 07:46:16 AMNice! did u use an offset at compile time to point to a function (offset to proc), or did u update the struct at runtime with the address of function?:


lea eax, FuncInit
mov Foo.Init, eax

Panel STRUCT 4
    hdc     dd  ?
    init    proc_Ptr  ?  <------- here
Panel ends


I use offset:
mov panel1.init, offset test_proc

calling:
invoke panel1.init, 10


HSE

But that only have sense if all offsets are from procedures with same number and type of arguments.  ??
Equations in Assembly: SmplMath

jj2007

include \masm32\include\masm32rt.inc

myvoke MACRO destination, args:VARARG
Local arg$, isL, isR, push$
  arg$ EQU <#>
  for arg, <args>
    arg$ CATSTR <arg>, <#>, arg$
  endm
  isL=0
  While 1
isR=isL+1
isL INSTR isR, arg$, <#>
IFE isL-isR
EXITM
endif
push$ SUBSTR arg$, isR, isL-isR
push push$
  ENDM
  call destination
ENDM

.code
MyTest:
  mov ecx, [esp+4]
  mov edx, [esp+8]
  invoke MessageBox, 0, ecx, edx, MB_OK
  retn 8

start:
  mov edx, offset MyTest
  myvoke edx, chr$("Seems to work"), chr$("That's the title")
  exit

end start

LordAdef

Quote from: HSE on January 14, 2025, 02:00:46 PMBut that only have sense if all offsets are from procedures with same number and type of arguments.  ??
Hi HSE!! it's been a long time.

Sure, but it fits well with the design I intend to implement. And it would not be expensive to define more protos to fulfill other procs. 

LordAdef

Quote from: jj2007 on January 14, 2025, 09:55:22 PMinclude \masm32\include\masm32rt.inc

myvoke MACRO destination, args:VARARG
Local arg$, isL, isR, push$
  arg$ EQU <#>
  for arg, <args>
    arg$ CATSTR <arg>, <#>, arg$
  endm
  isL=0
  While 1
isR=isL+1
isL INSTR isR, arg$, <#>
IFE isL-isR
EXITM
endif
push$ SUBSTR arg$, isR, isL-isR
push push$
  ENDM
  call destination
ENDM

.code
MyTest:
  mov ecx, [esp+4]
  mov edx, [esp+8]
  invoke MessageBox, 0, ecx, edx, MB_OK
  retn 8

start:
  mov edx, offset MyTest
  myvoke edx, chr$("Seems to work"), chr$("That's the title")
  exit

end start

Hi Johen!
I loved the "myvoke" name !