begin process at 2008 08 28 15:05:27
1 233 153 membres
257 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MASM :: SE COPIER AVEC GESTION DES ERREURS


Information sur la source

Catégorie :Api Windows Niveau : Débutant Date de création : 16/07/2003 Date de mise à jour : 16/07/2003 04:32:02 Vu : 2 407

Note :
Aucune note

Commentaire sur cette source (15)
Ajouter un commentaire et/ou une note


Description

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

Source

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

.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??
  • signaler à un administrateur
    Commentaire de BruNews le 16/07/2003 11:34:41 administrateur CS

    .data
    filename db 260 dup(0)
    dirname db 260 dup(0)

    la oui que devrait aller, faut reserver la place, tu avais 4 octets seulement pour file et dir, et si tu avais eu d'autres variables derriere auraient ete ecrasees idem.

  • signaler à un administrateur
    Commentaire de BlackWizzard le 16/07/2003 12:00:59 administrateur CS

    ok!
    mercu! :)

  • signaler à un administrateur
    Commentaire de Dean le 17/07/2003 21:05:16

    BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists);

    Tu est sûr qu'il n'y a pas un troisième paramètre à CopyFile ? Sur ton source je n'en vois que deux :-)

  • signaler à un administrateur
    Commentaire de BlackWizzard le 17/07/2003 23:05:33 administrateur CS

    ha ouai...
    ba G recup le code sur une source decompilé...alors les parametre, je met ce que je trouve ;)
    dans la source (virus) le programme se copie dans le rep windows (qu'il recup avant) et si il y a une erreur, alors il juge qu'il s'est deja copié, alors dans ce cas, il s'arrete.

  • signaler à un administrateur
    Commentaire de BlackWizzard le 17/07/2003 23:06:06 administrateur CS

    tu sais pas ou je px trouver une liste d'api trié par fichier (user32.dll, etc)?

  • signaler à un administrateur
    Commentaire de BruNews le 17/07/2003 23:07:51 administrateur CS

    MSDN a differents tris des APIs, c'est de loin la source la + fiable.

  • signaler à un administrateur
    Commentaire de BlackWizzard le 17/07/2003 23:10:14 administrateur CS

    ok
    thx

  • signaler à un administrateur
    Commentaire de Dean le 18/07/2003 00:28:52

    Le fichier Win32API.hlp est pas mal non plus, le classement ne se fait pas selon des DLLs mais dans un ordre logique (Entrées-sorties, hooking, etc ...), et on peut quand même voir les libs dont sont issues les fonctions.

  • signaler à un administrateur
    Commentaire de BlackWizzard le 18/07/2003 00:37:39 administrateur CS

    dis moi ou tu le trouve ton fichier car celui que G trouvé, il fait 232Ko et il est mal foutu...

  • signaler à un administrateur
    Commentaire de BruNews le 18/07/2003 00:44:25 administrateur CS

    pour BlackWizzard, on peut discuter MSDN.

  • signaler à un administrateur
    Commentaire de Dean le 18/07/2003 00:52:47

    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++.

  • signaler à un administrateur
    Commentaire de SMarmotte le 22/07/2003 20:55:29

    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 ...

  • signaler à un administrateur
    Commentaire de BlackWizzard le 23/07/2003 02:45:13 administrateur CS

    thx...
    on m'a deja dit plus haut dans les commentaire...
    G pas corrigé la source encore..

  • signaler à un administrateur
    Commentaire de ManChesTer le 27/07/2003 03:30:34 administrateur CS

    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.

  • signaler à un administrateur
    Commentaire de BruNews le 09/08/2003 11:02:25 administrateur CS

    LocalAlloc et GlobalAlloc ne sont presentes que pour assurer la compatibilite 16 bits.
    Sur win32, HeapAlloc ou VirtualAlloc.

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Boutique

Boutique de goodies CodeS-SourceS