Je veux appeler une fonction dont je connais l'adresse avec un nb variable d'arguments.
#include <stdarg.h> #include <stdio.h> #include <stdlib.h> void coucou(int i, int j) { printf("&i=0x%p\n",&i); printf("&j=0x%p\n",&j); printf("coucou=%d %d\n",i,j); } void callfuncv(void* ptr, ...) { va_list ap; va_start(ap, ptr); void (*fonction)(void*); printf("Function address 0x%p\n",ptr); printf(" ap 0x%p\n",ap); fonction=ptr; (*fonction)(ap); printf("Done."); va_end(ap); } int main(int argc, char *argv[]) { coucou(2,3); printf("\n"); callfuncv(&coucou, 2, 3); }
Voici ce que ca me donne:
E:\_doc\C\devcpp\arg_test>arg_test &i=0x0022FF50 &j=0x0022FF54 coucou=2 3 Function address 0x004012A0 ap 0x0022FF54 &i=0x0022FF30 &j=0x0022FF34 coucou=2293572 2293588 Done. E:\_doc\C\devcpp\arg_test>
Je me rends compte que AP pointe au bon endroit (j'ai vérifié que (int) (*ap) = 2 )
Ici, ca m'embête, parce que je voudrais qu'au 2e appel, on ait aussi &i=0x22FF54.
Quand j'appelle ma fonction par (*fonction)(ap); il me semble que ca va dire à la fonction de commencer à récupérer ses args à partir de 0x22FF54. Mais en fait, non, il fait un autre stack frame (normal en fait après quelque réflexion...)
En écrivant ce post je viens de réfléchir qu'il ne me faudrait pas faire un appel de fonction, mais un asm "jmp ptr". Mais comment lui dire où sont les arguments? en bidouillant SP? et comment être sûr que mes arguments sont passés par la pile?
Est ce bien ça?
N'y a-t-il aucun autre moyen?
Merci par avance.