Salut,
J'ai une incompréhension sur la convention d'appel Windows lorsqu'il y a plus de quatre arguments.
Par exemple pour la fonction "sendto", voici comment il faut procéder:
Ce que je ne comprend pas, c'est pourquoi commencer à empiler à "+32".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 mov qword [rsp+40],16 mov qword [rsp+32],sockaddr xor r9,r9 mov r8,6 mov rdx,sendbuf mov rcx,[sock] call [sendto]
Par exemple, pour un code x32, c'est logique puisque tous les arguments sont pushé sur la pile les uns après les autres, donc 0,+4,+8,+12 etc
Mais dans le cas du x64, les quatre premiers arg sont des registres, et donc, non pushés (non ?)
La proc suivante peut récupérer les 4 premiers arg directement dans les registres puisqu'ils y sont..
A moins que je n'ai rien compris, mais en tout cas, personnellement, sous Linux mes proc appelées récupèrent les arguments directement dans les registres correspondants.
Mais là, on doit faire comme si les quatre premiers arguments étaient pushé et commencer à +32.
Sous Linux, j'étais tombé sur une fonction avec plus de 6 arguments, et logiquement, pour le septième argument, j'avais simplement fait un "push arg". Et ça fonctionnait parfaitement..
Je fais des déductions qui sont peut être fausses car j'ai de grosses lacunes sur la pile, ce à quoi je tente de remédier progressivement (J'atttends de tomber sur une bonne doc entièrement dédié à la pile et bien technique).
Mais hier, pour ce "sendto", j'ai passé beaucoup de temps, sans comprendre pourquoi ça ne fonctionnait pas, puisque WSAGetLastError me sortait une erreur de type 10047..
J'ai pensé que comme pour WSAStarttup, la structure était différente en x64.. Du coup j'ai cherché et encore cherché, sans jamais comprendre.
C'est en me rappelant qu'il y avait un fichier "proc64.inc" pour windows et donc une macro "invoke" que j'ai compris en regardant le code (Il n'y a pas de "proc64.inc" pour Linux, donc j'ai appris à faire sans les macros).
Partager