LecteurEstDvd asm inline [Résolu]

Signaler
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
-
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 :)

++
A voir également:

7 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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 ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
ira mieux, maintenant faudra reserver les octets sur pile pour les variables.

ciao...
BruNews, Admin CS, MVP Visual C++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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 ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
25
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++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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

++