begin process at 2012 02 05 02:09:56
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Windows

 > SHELLEXEC-CMDLINE : LANCEUR D'APPLICATION PAR LA LIGNE DE COMMANDE

SHELLEXEC-CMDLINE : LANCEUR D'APPLICATION PAR LA LIGNE DE COMMANDE


 Information sur la source

Note :
9,4 / 10 - par 5 personnes
9,40 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Applications Windows Niveau :Débutant Date de création :27/09/2004 Date de mise à jour :28/09/2004 21:03:30 Vu / téléchargé :8 404 / 253

Auteur : DeAtHCrAsH

Ecrire un message privé
Site perso
Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Suite à une question sur le forum de www.cppfrance.com, j'ai fait ce petit bout de code afin de m'exercer en ASM et de répondre par la même occasion a la question posée.

Pour ce qui est de son utilité ce programme permet de lancer des applications via la ligne de commande.
Pour exemple, les autorun des CD ne peuvent lancer que des executables.
Ainsi en appellant depuis l'autorun ce petit programme, vous pourrez lancer tout type de fichier.

ex: ShellExec-CmdLine.exe http://www.asmfr.com d:\programme.exe

Voila à vous d'en faire ce que vous voulez.

Shell

Source

  • .486
  • .model flat, stdcall
  • option casemap:none
  • include \masm32\include\kernel32.inc
  • include \masm32\include\user32.inc
  • include \masm32\include\shell32.inc
  • includelib \masm32\lib\kernel32.lib
  • includelib \masm32\lib\user32.lib
  • includelib \masm32\lib\shell32.lib
  • .data?
  • argc db ?
  • argv dd 256 dup (?)
  • .data
  • szType db "open",0
  • .code
  • start:
  • ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • ; Début de récuperation des arguments passés a la ligne de commande
  • ; Code trouvé sur http://www.asmfr.com
  • ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • call GetCommandLine ; On récupère la ligne de commande sous forme de chaine
  • mov esi, eax ; On copie le pointeur de début de chaine dans ESI
  • lea edi, argv ; On lie le pointeur de argv dans EDI
  • xor ecx, ecx ; On met ECX a zéro
  • cl_skipspace:
  • cmp byte ptr [esi], 0 ; Si on est a la fin de la chaine
  • je cl_end ; On sort
  • cmp byte ptr [esi], 32 ; Sinon si le caractère lu n'est pas un espace
  • jne cl_findarg ; On lit l'argument passé en allant jusqu'au prochain espace
  • inc esi ; On incrémente esi pour se lire le caractere suivant dans ESI
  • jmp cl_skipspace ; On ignore les espaces
  • cl_findarg:
  • mov eax, esi ; On copie le pointeur de ESI vers EAX qui correspond au début de l'argument (son premier caractere)
  • mov edx, 32 ; On stoque le caractere espace dans EDX ( code ASCII = 32)
  • cmp byte ptr [esi], 34 ; On regarde si le premier caractere de l'argument est un guillemet (code ASCII = 34)
  • sete cl ; Dans ce cas, cl = 1 (sinon cl = 0)
  • lea edx, [edx + ecx * 2] ; edx = [espace] ou [guillemet]
  • add eax, ecx ; Si le premier caractere est un guillement, on se déplace d'un caractere
  • cl_parsearg:
  • inc esi ; On passe au caractere suivant
  • cmp byte ptr [esi], 0 ; On regarde si on est a la fin de la chaine
  • je cl_storelastarg ; Dans ce cas on stoque le pointeur de début du dernier argument dans le tableau argv
  • cmp byte ptr [esi], dl ; On regarde si le premier caractere de l'argument est un guillemet ou un espace
  • jne cl_parsearg ; Dans le cas contraire on continue a lister et sauvegarder les pointeurs de début de chaque argument
  • mov byte ptr [esi], 0 ; Sinon on met un caractere NULL a la fin de l'argument
  • stosd ; On stoque le pointeur dans argv
  • inc argc ; On incrémente le compteur (argc)
  • inc esi ; On récupere le caractere suivant
  • jmp cl_skipspace ; On ignore les espaces jusqu'a l'argument suivant
  • cl_storelastarg:
  • stosd ; On stoque le pointeur dans argv
  • inc argc ; On incrémente le compteur (argc)
  • cl_end:
  • ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • ; Fin de récuperation des arguments passés a la ligne de commande
  • ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • lea esi ,argv ; On copie l'adresse du premier élement de argv dans esi
  • ;;;;;;;;;;;;;;;;;
  • ; Debut de boucle
  • ;;;;;;;;;;;;;;;;;
  • deb_for:
  • cmp argc ,1 ; On compare le nombre d'argument restant à 1
  • je fin_for ; Si il reste 1 argument on sort de la boucle car le dernier argument et le chemin de l'executable
  • add esi, 4 ; On incrémente esi de 4 octets soit la taille d'un pointeur
  • push 0
  • push 0
  • push [esi]
  • push offset szType
  • push 0
  • call ShellExecute ; On execute l'argument
  • dec argc ; On décremente le nombre d'arguments
  • jmp deb_for ; On revient au début de la boucle
  • fin_for:
  • ;;;;;;;;;;;;;;;
  • ; Fin de boucle
  • ;;;;;;;;;;;;;;;
  • invoke ExitProcess,0 ; On quitte le programme
  • end start
.486 
.model flat, stdcall 
option casemap:none 

include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc
include \masm32\include\shell32.inc

includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib
includelib \masm32\lib\shell32.lib

.data?
argc     db    ?
argv     dd    256 dup (?)

.data
szType      db "open",0

.code

start: 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Début de récuperation des arguments passés a la ligne de commande
; Code trouvé sur http://www.asmfr.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
   call GetCommandLine      ; On récupère la ligne de commande sous forme de chaine
   mov esi, eax             ; On copie le pointeur de début de chaine dans ESI
   lea edi, argv            ; On lie le pointeur de argv dans EDI 
   xor ecx, ecx             ; On met ECX a zéro

   cl_skipspace:
   cmp byte ptr [esi], 0    ; Si on est a la fin de la chaine
   je cl_end                ; On sort
   cmp byte ptr [esi], 32   ; Sinon si le caractère lu n'est pas un espace
   jne cl_findarg           ; On lit l'argument passé en allant jusqu'au prochain espace
   inc esi                  ; On incrémente esi pour se lire le caractere suivant dans ESI
   jmp cl_skipspace         ; On ignore les espaces

   cl_findarg:
   mov eax, esi             ; On copie le pointeur de ESI vers EAX qui correspond au début de l'argument (son premier caractere)
   mov edx, 32              ; On stoque le caractere espace dans EDX ( code ASCII = 32)
   cmp byte ptr [esi], 34   ; On regarde si le premier caractere de l'argument est un guillemet (code ASCII = 34)
   sete cl                  ; Dans ce cas, cl = 1 (sinon cl = 0)
   lea edx, [edx + ecx * 2] ; edx = [espace] ou [guillemet]
   add eax, ecx             ; Si le premier caractere est un guillement, on se déplace d'un caractere

   cl_parsearg:
   inc esi                  ; On passe au caractere suivant
   cmp byte ptr [esi], 0    ; On regarde si on est a la fin de la chaine
   je cl_storelastarg       ; Dans ce cas on stoque le pointeur de début du dernier argument dans le tableau argv
   cmp byte ptr [esi], dl   ; On regarde si le premier caractere de l'argument est un guillemet ou un espace
   jne cl_parsearg          ; Dans le cas contraire on continue a lister et sauvegarder les pointeurs de début de chaque argument
   mov byte ptr [esi], 0    ; Sinon on met un caractere NULL a la fin de l'argument
   stosd                    ; On stoque le pointeur dans argv
   inc argc                 ; On incrémente le compteur (argc)
   inc esi                  ; On récupere le caractere suivant
   jmp cl_skipspace         ; On ignore les espaces jusqu'a l'argument suivant

   cl_storelastarg:
   stosd                    ; On stoque le pointeur dans argv
   inc argc                 ; On incrémente le compteur (argc)

   cl_end:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Fin de récuperation des arguments passés a la ligne de commande
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   lea esi ,argv           ; On copie l'adresse du premier élement de argv dans esi

;;;;;;;;;;;;;;;;;
; Debut de boucle
;;;;;;;;;;;;;;;;;    
deb_for:  
   cmp argc ,1             ; On compare le nombre d'argument restant à 1
   je fin_for              ; Si il reste 1 argument on sort de la boucle car le dernier argument et le chemin de l'executable
   
   add esi, 4              ; On incrémente esi de 4 octets soit la taille d'un pointeur
   
   push 0
   push 0
   push [esi]
   push offset szType
   push 0
   call ShellExecute       ; On execute l'argument

   dec argc                ; On décremente le nombre d'arguments

   jmp deb_for             ; On revient au début de la boucle
fin_for:   
;;;;;;;;;;;;;;;
; Fin de boucle
;;;;;;;;;;;;;;;    
   

   invoke ExitProcess,0    ; On quitte le programme
end start


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 septembre 2004 21:03:30 :
Ajout du code: Utile pour la consultation hors ligne sur le CD Codes-Sources

 Sources de la même categorie

Source avec Zip Source avec une capture DUMPER HEXADÉCIMAL par BLUEBIBUBBLE
Source avec Zip AFFICHAGE PIXEL EN ASM X86\VESA SOUS XP par wqaxs36
Source avec Zip LA COMMUNICATION ENTRE PROGRAMMES PAR ECHANGES DE MESSAGES par ToutEnMasm
Source avec Zip EDITEUR AVEC RICHEDIT ET OLE (POUR LES PHOTOS..) par ToutEnMasm
Source avec Zip METTRE UN BOUTON DANS UN CONTROLE EDIT par ToutEnMasm

Commentaires et avis

Commentaire de DeAtHCrAsH le 30/09/2004 21:09:28

Pas de commentaires ?
Peut être que mon programme est tout simplement parfait (:
Bref apparement il n'y a pas souvent de commentaires ou de réactions sur AsmFr.
C'est quand meme dommage.
Je sais pas si c'est pareil sur les autres sites du réseau CS ?!

Shell

Commentaire de DeAtHCrAsH le 03/10/2004 12:13:19

Merci beaucoup pour la note c'est gentil et ca motive.

Shell

Commentaire de l0st3d le 20/12/2004 08:44:04

Oui,Oui un commentaire!
Belle source, bien documenté
parfais pour un petit nouveau (je croie puisque je comprend quelque chose!)

Bravo
Bonne prog

Commentaire de missym le 27/12/2005 15:42:01

Bonjour,
j'ai des infos à te demander au sujet de ce programme, pourrais tu me dire à quelle adresse t'envoyer mes questions?
Merci d'avance
Missym

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 0,499 sec (4)

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