Noms win98 et ligne de commande masm32

Contenu du snippet

c'est un proc , integrable dans tout programme
Il permet de remplacer la fonction GETcl de masmlib et permet de passer des noms longs avec espaces , dans la ligne de commande.
des commentaires dans le source explique comment s'en servir
Modifs:ajouter des commentaires au source,plus lisible et corriger une ..imprécision
Nouvel ajout,la fonction fonctionnait sous WIN98,maintenant elle fonctionne aussi
avec XP

Source / Exemple :


;################################################################
			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

; #########################################################################

Conclusion :


Telecharger editmasm http://perso.wanadoo.fr/luce.yves

A voir également

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.