Soyez le premier à donner votre avis sur cette source.
Snippet vu 3 965 fois - Téléchargée 30 fois
;################################################################ comment ? Fonctionnement similaire a GetCL de masmlib ,en acceptant les noms longs avec espaces,c'est a dire en entree le numero de parametre voulu et l'adresse de la chaine ou ecrire la valeur du parametre si le numero est egal a zero,renvoi le nom de l'executable en retour ,eax = 0 pas de parametre,eax != 0 longueur de la chaine zero nom compris -------------------------- La distinction entre un nom de fichier et un parametre se fait par ":\" DANS LES commandes de RACCOURCIS,on doit passer LE NOM COMPLET du FICHIER sinon le NOM de fichier COMPORTANT DES ESPACES SERA DECOUPE comme un parametre Suivant le programme , le " encadrant le nom de l'executable ,peut signifier pas d'autre parametres ou l'inverse.Il faut visualiser la ligne (messagebox) sans parametres pour savoir dans quel cas on se trouve Comment determiner par avance quel va etre la reaction du programme,secret microsoft.Vous avez la reponse m'ecrire içi les " ne sont pas interprétés comme le signe de présence ou non d'autres paramètres ce qui permet de porter le sub dans n'importe quel programme ? GetParaLigneCommande PROC Numero:DWORD,AdrChaine:DWORD Local AdrPara :DWORD Local Cpt:DWORD Local Trema:DWORD Local Pointeur:DWORD local LongCommande:DWORD Local LongPara:DWORD Local Debutpara:DWORD Local FinPara:DWORD Local phrase[MAX_PATH]:BYTE Local decompte:DWORD LOCAL CHERCHEpara:WIN32_FIND_DATA invoke GetCommandLine mov AdrPara, eax ;adresse de la ligne de paramètres ;invoke MessageBox,NULL,AdrPara,SADD("Ligne de paramètres"),MB_OK mov esi,AdrPara xor eax,eax mov Cpt,eax mov Trema,eax invoke lnstr,AdrPara ;la ligne de para se termine par zero(byte) mov LongCommande,eax ;fin init pointeurs et variables ;le premier parametre est le nom complet de l'executable entre deux " si autres para ;passer le nom de l'executable encadrer ou non par " ;la suite des parametres est empilé convention dos,separé par des espaces,que le nom de ;fichier comporte ou non des espaces,ceci pour win 98 ;windows XP fonctionne différemment de 98 ;dans XP , tous les parametres sont entre " ce qui empeche la confusion entre noms longs ;avec espace et paramametres.les noms passés sont en convention noms longs. ;Avec 98 les noms de fichiers sont en convention dos et il faut les traduire en nom longs ; nom de fichier long avec espaces peut etre confondu ;Le cas ou le parametre est un nom long sans " se présente sous 98 et XP lorsque l'on ajoute ;ce parametre a un raccourci au lieu de pointer le fichier et d'utiliser envoyer vers ;c'est ce problème que résout l'appel a findfirstfile permettant d'identifier un nom de ;fichier long ou un répertoire en tant que parametre. ;recherche le debut de para du nom d'executable cld mov esi,AdrPara mov Debutpara,esi @@: ;passer espaces tab de têtes de ligne , le " lodsb .if al == 20h || al == 34 || al == 9 ; jusqu'a la fin du nom d'executable .if al == 34 mov Trema,1 ;signale la présence d'un tréma .endif jmp @B .endif dec esi mov Debutpara,esi ;esi 1 letrre de l'executable mov al,"." cld mov edi,Debutpara mov ecx,LongCommande repnz scasb ;edi pointe apres le "." ;la ligne de parametre commence mov eax,edi ;par nomprog.exe(ppath.exe) qui n'est pas un parametre mov esi,eax @@: lodsb .if al == 0 || al == " " || al == 34 ;poursuivre jusqu'a la fin du nom d'executable jmp @F .else jmp @B .endif @@: dec esi mov Pointeur,esi ;Pointeur apres .exe mov al,[esi] .if al == 34 inc Pointeur ;Pointeur apres le trema .endif mov ecx,esi sub ecx,Debutpara ;nombre de caracteres du chemin executable mov LongPara,ecx ; mov eax,Numero ; .if eax == 0 mov esi,Debutpara ;si le numero de para demandé est zero renvoyé mov ecx,LongPara mov edi,AdrChaine cld rep movsb mov al,0 stosb ;asciiz mov eax,LongPara ret .endif ;****************************** les parametres normaux ************************ ;****************************************************************************** ParametreSuivant: xor eax,eax mov Trema,eax ;avancé jusqu'au parametre suivant mov esi,Pointeur ;pointe le byte après le dernier parametre @@: cld lodsb .if al == 0 ;fin de ligne de commande xor eax,eax jmp FindeGetParaLigneCommande .elseif al == " " || al == 34 .if al == 34 mov Trema,1 ;signe XP le début du para est " .endif jmp @B .endif mov Debutpara,esi dec Debutpara ;un parametre existe mov ecx,LongCommande ;decompte de caracteres restant a explorés add ecx,AdrPara sub ecx,Debutpara mov decompte,ecx ;cela peut etre un mot , un chemin ecrit en convention windows ou dos mov esi,Debutpara mov edi,Debutpara ; trie les possibilités ;la solution la plus simple XP ;----------------------------------------------- .if Trema == 1 ;la signature XP mov al,34 cld repnz scasb mov Pointeur,edi ;edi est après " mov ecx,edi dec ecx ;ecx sur le " sub ecx,esi ; esi début du mot push ecx ;sauvegarde la longueur du mot mov esi,Debutpara lea edi,phrase cld mov decompte,ecx rep movsb mov al,0 stosb ;recopie le parametre dans phrase pop ecx jmp estcelebonnumerodepara .endif ;----------------------------------------------- ;WINDOWS 98 ;Nom chemin mov al,byte ptr [esi+1] .if al !=":" ;le : peut etre un debut de chemin jmp Paranom .endif mov al,byte ptr [esi+2] .if al != "\" jmp Paranom ; sequence : .endif ; ****** on est dans le cas d'un chemin convention dos ou windows ******* ;dos : envoyer vers (mettre le racourci dans windows\sendto ) ;windows : double clic sur fichier ; le but est de parcourir la chaine de droite a gauche en se positionnant sur les espaces ; et voir si l'intervalle entre debut de nom de fichier et espace correspond a un nom valide ; la longueur entre le debut et l'espace est limité a max-path ; ceci elimine les risques de coupures avec les fichiers comportant des espaces ;CELA OBLIGE A PASSER LE NOM COMPLET du FICHIER dans LES RACCOURCIS sinon ;LE NOM COMPORTANT DES ESPACES SERA DECOUPE mov eax,decompte .if eax > MAX_PATH mov eax,MAX_PATH mov decompte,eax .endif mov esi,Debutpara add esi,decompte mov ecx,decompte parcours: std ;ouille? lodsb dec decompte ;il n'y a pas de .if al == 0 || al == " " mov Pointeur,esi mov ecx,esi inc ecx sub ecx,Debutpara ;nombre de caracteres du chemin eventuel jmp @F .else mov eax,decompte .if eax != 0 jmp parcours .else ;pas de solution trouvée xor eax,eax jmp FindeGetParaLigneCommande .endif .endif @@: ;test pour voir si le fichier existe cld ;? mov esi,Debutpara lea edi,phrase cld rep movsb mov al,0 stosb ;recopie le parametre suppose dans phrase invoke FindFirstFile,addr phrase,addr CHERCHEpara mov edx,eax push eax invoke CloseHandle,edx mov ecx,decompte pop eax .if eax == INVALID_HANDLE_VALUE ;le parametre chemin est incomplet ou mal ecrit .if ecx == 0 ; erreur de chemin annule le parametre xor eax,eax jmp FindeGetParaLigneCommande .else ;pousuivre la recherche le nom comporte un espace mov esi,Pointeur jmp parcours .endif .else ;le parametre est valide inc Cpt mov eax,Cpt cmp eax,Numero jz @F ;ce n'est pas le bon numero de para demandé .if ecx != 0 inc Pointeur jmp ParametreSuivant .else ;il n'y a plus de parametres xor eax,eax jmp FindeGetParaLigneCommande .endif @@: invoke lstrcpy,AdrChaine,addr phrase mov eax,decompte jmp FindeGetParaLigneCommande .endif ;Bien que l'on puisse mettre un espace dans l'extension ,windows refuse de le passer en parametre ;auto (double clic) Paranom: ;----------------------------para normal DOS ------------------ mov ecx,LongCommande ;decompte de caracteres restant a explorés add ecx,Debutpara sub ecx,AdrPara ;arret sur zero ou espace @@: cld lodsb .if al == 0 || al == " " mov Pointeur,esi ;pointeur byte après para jmp @F .endif loop @B ;ne devant pas se produire ecx=0 et al non zero xor eax,eax jmp FindeGetParaLigneCommande @@: ;le parametre est valide push ecx mov ecx,Pointeur sub ecx,Debutpara mov esi,Debutpara lea edi,phrase cld mov decompte,ecx rep movsb mov al,0 stosb ;recopie le parametre dans phrase pop ecx estcelebonnumerodepara: inc Cpt mov eax,Cpt cmp eax,Numero jz @F ;ce n'est pas le bon numero de para demandé .if ecx != 0 jmp ParametreSuivant .else ;il n'y a plus de parametres xor eax,eax jmp FindeGetParaLigneCommande .endif @@: invoke lstrcpy,AdrChaine,addr phrase mov eax,decompte FindeGetParaLigneCommande: ret GetParaLigneCommande endp ; #########################################################################
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.