Masm :: se copier avec gestion des erreurs

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 323 fois - Téléchargée 29 fois

Contenu du snippet

voici un code que je vien de faire qui permet a une appli de se copier, avec gestion des erreurs.

Source / Exemple :


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

.386
.model flat, stdcall
option casemap :none   ; case sensitive

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

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc

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

; #########################################################################
.data
    ; # variable dynamiques #
    filename    dd 0
    dirname     dd 0

.code

    Mtitle      db "codé par BlackWizzard",0
    message     db "fichier copié avec succes :)",0
    erreurmsg   db "erreur durant la copie :(",0
    newname     db "test.exe",0
start:

    push 46h                    ; taille maximum buffer (+ si crainte du buffer overflow)
    push offset filename        ; variable qui va accueillir la reponse
    push 0                      ; sais pas a koi ça correspond
    call GetModuleFileNameA     ; appel de l'API
                                ; on connais le nom de notre programme, on commence la copie
    push offset newname         ; argument "destination"
    push offset filename        ; argument "fichier source"
    call CopyFileA              ; on appel l'API
    cmp eax, 0                  ; si eax = 0: erreur (fichier deja existant, etc...)
    jz short erreur             ; dans ce cas, on va direct a "erreur:" pour signaler
    
    push MB_OK                  ; MB_OK = 0
    push offset Mtitle          ; le titre
    push offset message         ; le message
    push 0                      ; sais pas
    call MessageBox             ; on appel l'API

    push 0                      ; sais pas
    call ExitProcess            ; on appel l'API pour terminer le programme
    
erreur:                         ; en cas d'erreur
    push MB_OK  ; MB_OK = 0     ; blablabla...G deja expliké plus haut...
    push offset Mtitle
    push offset erreurmsg
    push 0
    call MessageBox

    push 0
    call ExitProcess

end start

Conclusion :


un chose que G pas compris, si je fait un appel a l'API GetCurrentDirectoryA (que je met dans une variable dirname), la variable filename (GetModuleFileNameA) sera corrompu, elle sera toute melangé...
pkoi ça fait ça? Pkoi je px pas faire appel aux 2 api a la suite, sans que ça me pourrisse la premiere variable??

A voir également

Ajouter un commentaire Commentaires
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
24
LocalAlloc et GlobalAlloc ne sont presentes que pour assurer la compatibilite 16 bits.
Sur win32, HeapAlloc ou VirtualAlloc.
Messages postés
374
Date d'inscription
vendredi 20 octobre 2000
Statut
Modérateur
Dernière intervention
30 novembre 2020

Bon BlackWizard pour les filenames 2 soluces sous windows:

1 : db Max_Path dup(0) <== max_path=Taille max d'un chemin sous win qui peut etre bien supèrieur a 256chars....

2 : Tu fais un LocalAlloc ou GlobalAlloc (api) sur ton pointeur puis un LocalFree ou GlobalFree des que tu n'utilise plu ton pointer ...

L' Alloc est et de loin la meilleur solution....

Bon Coding...

ManChesTer.
Messages postés
1258
Date d'inscription
mercredi 21 mars 2001
Statut
Modérateur
Dernière intervention
21 juin 2009
2
thx...
on m'a deja dit plus haut dans les commentaire...
G pas corrigé la source encore..
Messages postés
53
Date d'inscription
vendredi 17 janvier 2003
Statut
Membre
Dernière intervention
12 novembre 2005

Y'a un truc qui devrai t'allerter grave mon gars
GetModuleFileNameA prend pour 2nd paramètre un buffer pour y stocker le nom de ton EXE. Toi tu lui fourni un DWORD (qui est aussi un buffer ..... mais de 4 octets)
Ce que je te conseille :: à la place de
filename dd 0
dirname dd 0
tu mets
filename db 260 dup (0)
dirname db 260 dup (0)

comme ça : adieu ton problème ...
Messages postés
500
Date d'inscription
mardi 16 avril 2002
Statut
Membre
Dernière intervention
2 août 2004

ftp://ftpc.borland.com/pub/delphi/techpubs/delphi2/win32.zip

Je crois qu'il existe une version plus récente fournie avec Delphi, et également récupérable avec l'update tool de Dev C++.
Afficher les 15 commentaires

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.