LecteurEstDvd asm inline

Résolu
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 15 août 2004 à 11:08
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 15 août 2004 à 15:22
Bonjour,

Voila j'ai un ptit pb au nivo, je pense, de l'appel de la fonction DeviceIoControl, le code :

//Fonction C
int __stdcall LecteurEstDvd(char *pszdrv, void *pmem)
{
HANDLE hdev;
char buff[12];
DWORD n, r = 0;
if(!pmem) return 0;
*((DWORD*) buff) = 0x5C2E5C5C; // "\\\\.\"
buff[4] = pszdrv[0]; buff[5] = ':'; buff[6] = 0;
hdev = CreateFile(buff,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
if(hdev == INVALID_HANDLE_VALUE) return 0;
if(DeviceIoControl(hdev, 2952196, 0, 0, pmem, 4096, &n, 0)) r (*((DWORD*) pmem) 0x33);
CloseHandle(hdev);
return r;
}

//Fonction ASM
_declspec(naked) int __stdcall a_LecteurEstDvd(char *pszdrv, void *pmem)
{
__asm {
mov eax, [esp + 8]
mov ecx, [esp + 4]
test eax, eax
jz Fin0
lea edx, [esp - 12]
mov esp, edx
mov dword ptr[edx], 5C2E5C5Ch
mov eax, [ecx]
mov [edx + 4], eax
mov dword ptr[edx + 5], 03Ah //":\0"
xor eax, eax
push eax
push eax
push 3
push eax
push 1
push GENERIC_READ
push edx
call dword ptr CreateFile
cmp eax, -1
je Fin0
mov ecx, [esp + 8]
push eax //pour CloseHandle
xor edx, edx
push edx
push edx
push 4096
push ecx
push edx
push edx
push 2952196
push eax
call dword ptr DeviceIoControl
call dword ptr CloseHandle
mov ecx, [esp + 8]
cmp dword ptr[ecx], 33h
je Fin1
Fin0:
add esp, 12
xor eax, eax
ret 8
Fin1:
add esp, 12
mov eax, 1
ret 8
}
}

En fait, au final, aucun lecteur n'est détecté comme DVD, au moins il s'execute (jsuis content ;). Je pense ke cela vient du cmp dword ptr[ecx], 33h, si kelkun pouvait confirmer et/ou trouver l'erreur, merci :)

Merci d'avance :)

++

7 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 août 2004 à 15:12
Voila en 15 lignes de moins que VS 2003 avec toutes optimisations. N'utilise que les 3 registres generaux.

C'est pas tres complique mais tu devrais debuter sur des petits trucs beaucoup plus simples. Je repete, dessine ta stack sur papier pour verifier que tu mets les bonnes adresses dans les registres que tu passes en param. Evite aussi les exemples avec DeviceIoControl au debut ou tu risques de graves degats.

__declspec(naked) int __stdcall LecteurEstDvd(char *pszdrv, void *pmem)
{
__asm {
lea ecx, [esp-12]
xor eax, eax
mov edx, [ecx+16] ; EDX = *pszdrv
cmp [ecx+20], eax
je short dvdExit ; if(!pmem) return 0
mov ah, ':'
mov esp, ecx ; ESP -= 12
mov al, [edx] ; pszdrv[0]
mov dword ptr[ecx], 5C2E5C5Ch
mov dword ptr[ecx+4], eax
; CreateFile(buff,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)
push 0
push 0
push OPEN_EXISTING
push 0
push FILE_SHARE_READ
push GENERIC_READ
push ecx
call dword ptr CreateFile
mov edx, esp ; &n
mov ecx, [esp+20] ; *pmem
cmp eax, -1
je short retZERO
push eax ; pour CloseHandle
; DeviceIoControl(hdev, 2952196, 0, 0, pmem, 4096, &n, 0)
push 0
push edx ; &n
push 4096
push ecx ; *pmem
push 0
push 0
push 2952196
push eax
call dword ptr DeviceIoControl
mov [esp+4], eax ; sauve r
call dword ptr CloseHandle ; param deja sur pile, ESP += 4
mov eax, [esp+20] ; *pmem
cmp dword ptr[esp], 0
je short retZERO
cmp dword ptr[eax], 33h
je short cleanSP ; sort en EAX != 0
retZERO: xor eax, eax
cleanSP: add esp, 12
dvdExit: ret 8
}
}

ciao...
BruNews, Admin CS, MVP Visual C++
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 août 2004 à 12:36
Regarde 'jz Fin0' au debut, tu envoies sur:
add esp, 12
ceci crash a coup sur, esp n'a jamais recule auparavant.
Faut maitriser la stack avant d'aller plus loin.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
15 août 2004 à 13:33
mov eax, [esp + 8]
mov ecx, [esp + 4]
test eax, eax
jnz Continue
ret 8
Continue:
lea edx, [esp - 12]

Voila le bout de code de debut modifié, c bon non ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 août 2004 à 13:39
ira mieux, maintenant faudra reserver les octets sur pile pour les variables.

ciao...
BruNews, Admin CS, MVP Visual C++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
15 août 2004 à 14:24
J'ai du mal avec la reservation des octets pour les variables, est ce ke je dois aussi reserver pour DWORD r, n ? Paske pour le handle, jme suis demerdé pour le sauver ds [esp + 4] car on utilise plus pszdrv, mais apres j'ai du mal avec ces variables la. Et surtout sont elles vraiment nécessaires ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 août 2004 à 14:31
on reserve en reculant ESP qu'il faudra ensuite replacer avant de sortir.
Dessine ta stack sur papier, c'est utile au debut.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
15 août 2004 à 15:22
Bon ben jte remercie, cette fonction me paraissait pourtant assez simple, mais apparemment trop dur pour moi, jV fouiller pour trouver plus facile. Merci encore

++
0
Rejoignez-nous