Aidez moi à traduire une petite fonction assembleur en C (API Windows)

Signaler
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
-
Bonjour à tous,



J'essaye désespérément de traduire une fonction ASM en C. Le but de
cette fonction est de pouvoir utiliser une ressource compilé dans mon
exécutable.

Ce n'est pas moi qui ai écrit cette fonction en assembleur mais elle fonctionne très bien.



Voici la fonction en question :



INVOKE GetModuleHandle, NULL

mov hInstance, eax



; Charge et utilise une resource

push esi

INVOKE FindResource, hInstance, RESOURCE_FILE, RT_RCDATA

push eax

INVOKE SizeofResource, hInstance, eax

mov nResourceSize, eax

pop eax

INVOKE LoadResource, hInstance, eax

INVOKE LockResource, eax

mov esi, eax

mov eax, nResourceSize

add eax, SIZEOF nResourceSize

INVOKE GlobalAlloc, GPTR, eax

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov pResource, eax

mov ecx, nResourceSize

mov dword ptr [eax], ecx

add eax, SIZEOF nResourceSize

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

mov edi, eax

rep movsb ; peut être remplacé par ;INVOKE RtlMoveMemory,edi,esi,nResourceSize

pop esi

INVOKE UseResource, pResource



Voici ce que j'ai pu écrire en C mais cela ne semble pas fonctionner :



HINSTANCE g_hInst;

LPVOID pMusic, pMusicTmp;



g_hInst = hThisInstance; // Provient de mon WinMain

HRSRC res = FindResource(g_hInst, MAKEINTRESOURCE(XM_FILE), RT_RCDATA);

DWORD nResourceSize = SizeofResource(g_hInst, res);

HGLOBAL loadRes = LoadResource(g_hInst, res);

LPVOID lockRes = LockResource(loadRes);

pResourceTmp pResource GlobalAlloc(GPTR, nResourceSize + sizeof(nResourceSize));

pResourceTmp = (void*)(nResourceSize);

MoveMemory(&pResource + sizeof(nResourceSize), lockRes, nResourceSize);

UseResource(pResource);



C'est la partie assembleur délimité par des ; qui me pose des problèmes. Je ne sais pas comment l'écrire en C.



Merci d'avance pour votre aide car la je galère vraiment

4 réponses

Messages postés
570
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
18 janvier 2021
2
Salut,
les ; il n'y a pas de quoi fouetter un chat si on ne peut pas les traduire.
Ce sont des commentaires,les suprimer ou les passer sur une ligne ne comportant que des commentaires.
// commentairesJe doute un peu des emboités.
Le ; en C marque la fin d'une instruction
Pas de {} marquant des proc ?
winmain { avec le
code dedans}.
Je ne suis pas une référence en C,peut être que sur le forum du C ?
ToutEnMasm
Messages postés
96
Date d'inscription
vendredi 1 avril 2005
Statut
Membre
Dernière intervention
26 juillet 2007

Salut ToutEnMasm,



je sais bien que les ; sont des commentaires. J'ai mis dans mon message:




C'est la partie assembleur délimité par des ; qui me pose des problèmes. Je ne sais pas comment l'écrire en C.






Les = emboités, je ne doute pas dessus.



En fait, j'aimerais simplement avoir l'équivalent du code entre les ;;;; en C

C'est surtout la commande: mov dword ptr [eax], ecx qui me pose problème car en C, la fonction LockResource retourne un LPVOID donc un pointeur.


Comment accéder à la valeur pointée d'un pointeur pour la modifier ???
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
salut,

tu n'as pas besoin de la traduire, c fait automatiquement
par (&pResource + sizeof(nResourceSize)).

@++
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
re,

en c, tu fait ( *monpointeur = ma valeur );
en asm, tu fait ( mov [monpointeur],valeur );

@++