DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008
-
4 mai 2005 à 04:53
DeadlyPredator
Messages postés222Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention30 juin 2008
-
4 mai 2005 à 21:01
Bonjour, je voudrais créer une fonction permettant d'appeller des APIs sans avoir besoins de déclarer leur prototype ni en utilisant les .lib. Lorsque j'éxécute mon code, ma msgbox apparait, parfaite. Après que j'appuie sur OK, erreur. Ça serait le registre ESP le problème. j'ai lu qu'il y a des registres qu'il fallait sauver et restaurer mais comme mes connaissances en asm sont très limitées, je ne sais pas comment faire.
int _stdcall StdCallAPI(LPCSTR dllName, LPCSTR APIName,int Params[], int ParamsCount)
{
HMODULE hLib;
FARPROC pProc= 0;
int iFlag=MB_ICONASTERISK+MB_YESNO;
int RetVal;
char* texte="allo";
hLib=LoadLibrary("User32.dll"/*dllName*/);
pProc=GetProcAddress(hLib,"MessageBoxA"/*APIName*/);
__asm
{
//paramètres pour l'api [
mov eax,20
push eax
mov eax,texte
push eax
mov eax,texte
push eax
mov eax,0
push eax
// ]
call pProc //appel de l'api
mov RetVal,eax //envoie de la valeur dans la variable RetVal
gnoofy120
Messages postés17Date d'inscriptionmercredi 26 janvier 2005StatutMembreDernière intervention14 juin 2006 4 mai 2005 à 07:28
Salut,
Pour les Api win32 il me semble que c'est la fonction qui nettoie la pile, dans ton cas tu ne dois pas avoir de pop après le call.
D'une manière générale si tu fais ce genre de bricolage utilises ton debugger et surveilles la valeur des registres.
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 4 mai 2005 à 09:08
Pour les fonctions de l'API, il ne faut pas nettoyer la pile après l'appel (__stdcall). C'est la fonction appelée qui s'en charge et donc il faut s'assurer d'empiler le bon nombre de paramètres.
cs_AlexMAN
Messages postés1536Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention24 mai 20091 4 mai 2005 à 09:15
Si tu ne 'pop' pas les registres, pourquoi les restaures tu ?
__asm
{
//paramètres pour l'api [
mov eax,20
push eax
mov eax,texte
push eax
mov eax,texte
push eax
mov eax,0
push eax
call pProc //appel de l'api
mov RetVal,eax //envoie de la valeur dans la variable RetVal
}
Ca devrait marcher correctement. Comme l'a dit gnoofy, les API sont 'stdcall', cela signifie que les parametres que tu empiles vont etre depilés par la fonction.
En ASM, seuls 3 registres n'ont pas besoin d'etre sauvegardé (uniquement si tu les utilises) : les registres EAX, ECX et EDX. Tous les autres doivent etre empilés au debut de la fonction et depilés en fin.
Voila, si tu veux plus de renseignement, n'hesite pas. Au fait, est ce que tu vois 'texte' dans la MessageBox() ?