begin process at 2012 05 25 05:08:17
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Assembleur

 > 

Archives

 > 

Newbii

 > 

LecteurEstDvd asm inline


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

LecteurEstDvd asm inline

dimanche 15 août 2004 à 11:08:54 | LecteurEstDvd asm inline

AlexMAN

Membre Club
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 :)

++
dimanche 15 août 2004 à 12:36:44 | Re : LecteurEstDvd asm inline

BruNews

Administrateur CodeS-SourceS
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++
dimanche 15 août 2004 à 13:33:53 | Re : LecteurEstDvd asm inline

AlexMAN

Membre Club
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 ?
dimanche 15 août 2004 à 13:39:38 | Re : LecteurEstDvd asm inline

BruNews

Administrateur CodeS-SourceS
ira mieux, maintenant faudra reserver les octets sur pile pour les variables.

ciao...
BruNews, Admin CS, MVP Visual C++
dimanche 15 août 2004 à 14:24:12 | Re : LecteurEstDvd asm inline

AlexMAN

Membre Club
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 ?
dimanche 15 août 2004 à 14:31:34 | Re : LecteurEstDvd asm inline

BruNews

Administrateur CodeS-SourceS
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++
dimanche 15 août 2004 à 15:12:32 | Re : LecteurEstDvd asm inline

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
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++
dimanche 15 août 2004 à 15:22:38 | Re : LecteurEstDvd asm inline

AlexMAN

Membre Club
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

++


Cette discussion est classée dans : mov, dword, push, eax, edx


Répondre à ce message

Sujets en rapport avec ce message

BeginPaint code débutant [ par TRAX44 ] Bonjour, le problème est tout simple je comprends absolument pas ce qui marche pas. Le "programme" est censé créer une fenêtre est afficher du texte e Cycles de mov [ par vecchio56 ] Je me demandais si les instructions suivantes étaient équivalentes en termes de performances, ou si certaines d'entres elles demandaient plus de cycle # Export Table - Kernel32.dll - GetProcessAddress # [ par joanna ] Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".Malheureusement à la # Export Table --- Kernell32.dll --- GetProcAddress # [ par joanna ] Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".Malheureusement à la Ancien code - CreateWindowEx ne fonctionne pas [ par TehWan ] Je ne comprends vraiment pas pourquoi CreateWindowEx ne fonctionne pas. Je code en ancien code avec MASM32. J'ai même essayé la nouvelle syntaxe (invo optimisation [ par sajid_morad ] salut tout le monde , j ai une parti du code en c++, que j ai voulu optimiser , le l ai reécri en asm , mai ça donne pas grand chose, si quelqu un po Quels sont les parametres (nombre, taille...) [ par Renfield ] Bonjour,on peut appeler RunDll32 pour executer des fonctions contenues dans des dll...j'aimerais m'affranchir de cette étape, mais j'ai pour cela beso Problemme avec mes character... XD [ par belette321 ] J'esseil d'ajouter une commande administrateur a dans un des mes jeux en-ligne, /admin_popup (Fait apparaitre un MSG dans une boite dans le lobby). Un nombre premier en nasm [ par YAWLY ] MED.MERZOUG salut tout le monde vous pouvez m'aider si j le compile sa affiche chaque fois le nbr est non premeir > le code est : Section .date ch out bmp [ par vincent2795 ] Bonjour, dans ma source, j' essaye de faire un screenshot, et de le nommer pas la date et l' heure ou il es pris. mon problème: si le nom du fichier e


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales