    Documentation pour:
    -------------------
    LZEXE.EXE v0.91    (c) 1989 Fabrice BELLARD
    Compacteur de fichiers EXE.
    
    
    Ce programme fait parti du domaine public (FREEWARE),  donc vous pouvez
  l'utiliser, le copier et le distribuer sans problème. Et vous pouvez même
  en faire un usage commercial, c'est à dire compacter des fichiers EXE que
  vous allez vendre. Mais la vente de LZEXE.EXE est interdite.
    
    
    Matériel:  PC et compatibles, microprocesseur 80286 ou 80386 recommandé
  pour une plus grande vitesse d'exécution.
    Mémoire nécessaire: 128 Ko minimum pour lancer LZEXE.
    
    
    1-Présentation
    --------------
    
        Ce logiciel  compacte  des fichiers  EXE, c'est-à-dire les fichiers
  EXEcutable du monde des  PC.  Mais vous pourriez me dire que  beaucoup de
  logiciels  compactent des fichiers EXE mieux que  celui-ci,  ne serait-ce
  que  l'excellent PKZIP ou  bien  LHARC.  Mais l'avantage de  ce programme
  c'est que vos fichiers EXE une fois compactés peuvent être lancés ! Et le
  décompactage est si  rapide que  pour pratiquement tous  les fichiers, ce
  temps de décompactage est négligeable ! De plus le décompacteur n'utilise
  aucun espace supplémentaire sur disque ou en mémoire vive dans  un disque
  virtuel par exemple:  il  n'utilise que la  RAM  réservée  normalement au
  fichier EXE décompacté.  De plus j'ai beaucoup optimisé mon algorithme de
  compactage  en  vitesse mais aussi  en efficacité:  les fichiers EXE sont
  presque  aussi petits  que les fichiers  ZIP correspondants  et bien plus
  compacts que les anciens fichiers  ARC.  Mais d'autres versions  de LZEXE
  suivront qui  je  l'espère  iront  encore  plus  vite  et  genèreront des
  fichiers plus compacts. 
    
    2-Utilisation de LZEXE
    ----------------------
    
        C'est très simple: il suffit de taper sous DOS:
    
    LZEXE nomfichier[.EXE]
    
    où "nomfichier"  est le nom du fichier EXE que  vous  voulez compacter.
  L'extension  .EXE  est ajoutée par défaut.  Le fichier compacté  est créé
  dans le répertoire par défaut.
    
    Attention !  Certains fichiers ne sont EXE que par leur  nom: en effet,
  pour  le DOS,  ce n'est pas l'extension .EXE  qui caractérise ce  type de
  fichier,  c'est le fait qu'il y ait au début les lettres  "MZ" suivies de
  quelques octets qui indiquent la  longueur du fichier,  la taille mémoire
  qu'il occupe,  etc... Ainsi certaines personnes n'hésitent pas à renommer
  des fichiers  COM en  EXE,  et  cela  explique que  LZEXE refuse certains
  fichiers EXE qui ne sont que des COM renommés.
    
    Mais  il  existe  une méthode pour  faire accepter  des fichiers  COM à
  LZEXE:  il  suffit d'utiliser COMTOEXE  du même auteur  qui convertit ces
  derniers en EXE (il fait l'inverse de EXE2BIN).
    
    Pour plus de sûreté, LZEXE n'efface pas votre ancien fichier EXE: il le
  renomme en *.OLD.  De plus,  il crée le fichier temporaire  LZEXE.TMP qui
  n'est renommé en *.EXE qu'à la fin du compactage.
    
    3-Conseils d'utilisation
    ------------------------
    
        Pour certains fichiers,  le compactage peut ne pas fonctionner pour
  plusieurs raisons:
    
    -  Le fichier que vous avez spécifié n'est pas un  vrai  EXE. Solution:
  utiliser COMTOEXE.EXE
    -  La table de relocation est trop grande.  Pour comprendre ce message,
  il est nécessaire de connaître  la structure interne d'un fichier EXE: un
  tel  fichier peut  s'étaler  sur plusieurs segments  à la  différence des
  fichiers COM. C'est pourquoi il lui faut une table de valeurs qui indique
  dans  quel  segment se  font  les  branchements  ou  les  appels  de sous
  programmes par exemple.  Et si le fichier est très long, cette table peut
  être très encombrante et empêcher  le compacteur d'agir.  Néanmoins, j'ai
  prévu 16000  adresses de relocation, ce qui devrait suffire pour tous les
  fichiers EXE, même les plus gros.
    - Le fichier que vous avez spécifié a déjà été compacté avec LZEXE. 
    
    Notons  qu'un  autre  compacteur  de  fichiers  existe:  EXEPACK.EXE de
  Microsoft.  Mais il est de loin beaucoup moins efficace  que le  mien, et
  même si  votre fichier EXE est déjà  compacté  avec  ce  programme, LZEXE
  pourra encore beaucoup compacter. Mais dans ce cas, un message de mise en
  garde  vous  est présenté,  car  il  existe  un autre  utilitaire du même
  auteur:  UPACKEXE  qui permet  de  décompacter ces fichiers  et ainsi les
  gains sont encore plus importants.
    
    -  Le compactage n'a pas été assez efficace et fait  perdre de l'espace
  sur disque:  Hé oui,  ça peut arriver,  mais généralement avec les petits
  EXE (moins  de  2  Ko).  Sinon, vous pourrez pratiquement toujours gagner
  quelques octets. 
    
    -  Le fichier EXE contient des overlays internes:  ce sont des morceaux
  de programme qui se trouvent  dans le fichier EXE mais  qui  sont chargés
  seulement quand le programme principal en a besoin. LZEXE ne peut pas les
  compacter car il  faudrait  modifier  le routines de  chargement qui sont
  dans le programme principal, et malheureusement ces routines dépendent du
  compilateur et du programmeur.  Dans la version 0.91,  LZEXE  vous met en
  garde de leur présence. Mais dans beaucoup de cas, la différence entre la
  longueur  du  fichier EXE sur disque  et  la longueur du  code chargé est
  minime  (moins  de  1024  octets)  :  dans ce cas, vous pouvez quand même
  compacter car il s'agit de "marques" laissées par certains compilateurs.
    
    
    Plus grave: certains fichiers EXE compactés "planteront" la machine:
    
    -  Si le programme EXE fait un test sur la taille ou  sur son intégrité
  sur disque (c'est très rare).
    -  S'il contient des overlays, qui doivent être chargés ensuite et donc
  qui doivent occuper des positions fixes dans le fichier.
    -  Pour les programmes qui marchent sous Windows (de  Microsoft): ce ne
  sont pas  de vrais EXE,  donc ils refuseront  de fonctionner correctement
  sous l'intégrateur.
    (cette liste n'est pas exhaustive)
    
    
    Moins grave: Certains programmes possèdent des options de configuration
  qui modifient le fichier EXE (Turbo Pascal par exemple).  Dans ce cas, il
  faut d'abord configurer le programme  puis le compacter et  conserver une
  version non compactée pour pouvoir la modifier.
    
    
    4-Du point de vue technique (pour les connaisseurs !)
    -----------------------------------------------------
    
    L'algorithme  de  compactage  que j'ai  fait  est fondé sur  la fameuse
  méthode de Ziv Lempel utilisant  un buffer "circulaire"  (ring buffer) et
  une méthode  de recherche des  répétitions de séquences  d'octets par des
  arbres.  Le codage  de  la  position et la  longueur de la  chaîne qui se
  répètent est optimisé par un algorithme annexe  inspiré de  la méthode de
  Huffman. Les octets non compactés sont envoyés tels quels dans le fichier
  car un algorithme de compression annexe (  comme "Adaptive Huffman" (voir
  LHARC)  ou avec des arbres de Shanon-Fano (voir PKZIP))  aurait nécessité
  un temps de décompactage plus  important et surtout  un décompacteur plus
  complexe et long, ce qui aurait en fait allongé le fichier EXE compacté.
    
    Le décompacteur est logé à la fin du fichier EXE et fait  395 octets de
  long pour la version 0.90 et 330 pour la version 0.91.  Il  doit:
    -  Contrôler le CRC pour s'assurer que personne  ne  l'a modifié (utile
  contre les virus). Si oui, afficher le message: "CRC Error". Cette option
  a été enlevée  dans LZEXE v0.91  car elle allonge  inutilement le fichier
  EXE et le temps de décompactage.  De plus le contrôle du CRC n'était fait
  que sur le décompacteur. 
    -  Se déplacer en haut de la RAM,  puis déplacer le code  compacté pour
  laisser un peu de place au fichier EXE
    -  Décompacter  le  code,  en contrôlant qu'il est  correct, et surtout
  ajuster les segments si on dépasse 64  Ko  (ce qui m'a posé des problèmes
  en terme de vitesse)
    -  Décompacter la table de  relocation,  et mettre à  jour les adresses
  relogeables de fichiers EXE.  C'est ici que LZEXE v0.91 a été modifié: la
  table de relocation est beaucoup mieux compactée.
    - Lancer le programme en mettant à jour CS,IP,SS,SP
    
    C'est tout !!!
    
    Ce décompacteur est à lui seul un petit  chef-d'oeuvre de programmation
  en assembleur 8086: inutile de vous dire que sa mise au point a été assez
  longue. 
    Mais le compacteur m'a aussi posé pas mal de  problèmes, notamment pour
  mettre à jour  tous  les pointeurs que  le  décompacteur  utilise  par la
  suite.
    
    
    5-LZEXE version 0.91 et les autres compacteurs
    ----------------------------------------------
    
    PKARC (dernière version):  LZEXE  fait  beaucoup  mieux, le "crunching"
  (alias Shrinking pour PKZIP) étant un algorithme dépassé...
    
    PKZIP v0.92:  LZEXE mieux dans pratiquement tous les  cas.
    
    PKZIP v1.02:  sur  les  gros  fichiers,  LZEXE  fait  mieux.  sinon, la
  différence  est assez faible.
    LHARC  v1.01:  il fait mieux que LZEXE avec  "freezing"  sur les petits
  fichiers.
    
    LARC: LZEXE fait mieux.
    
    Remarques importantes: 
    -  On ne peut pas vraiment comparer ce  que fait LZEXE  avec les autres
  compacteurs puisque dans les fichiers EXE compactés  par mon soft  il y a
  aussi  un  décompacteur  qui le  lance tout  seul.  Néanmoins  les autres
  compacteurs  peuvent  faire  des  fichiers  "self-extracting",  mais  ils
  décompactent sur disque,  sont lents et ajoutent plusieurs dizaines de Ko
  aux fichier compactés (sauf pour LARC et LHARC qui n'ajoutent  qu'1  ou 2
  Ko, mais qui ne décompactent que sur disque malheureusement).
    - Dans presque tous les cas, les compacteurs que j'ai cités ne pourront
  pas recompacter plus un fichier déjà réduit avec LZEXE, ce qui montre son
  efficacité. Seul LHarc arrive à gagner quelques octets.
    
    
    6-L'avenir...
    -------------
    
    -  je  pense aussi à un  décompacteur  automatique de  documentation du
  genre de LISEZMOI.COM  ou LIST.COM qui serait  très commode  et peut être
  que je vais en faire un.
    -  Enfin, j'espère faire un compacteur "universel" comme PKZIP ou LHARC
  plus lent que LZEXE en décompactage mais qui fera beaucoup mieux  que ces
  derniers.
    
    
    7-Mises en garde et voeux...
    ---------------------------
    
    J'espère  que LZEXE  et  les  fichiers  EXE  compactés  par  lui seront
  beaucoup  diffusés  ce  qui m'incitera  à  faire  d'autres  versions plus
  rapides...
    
    Je  décline  toute  responsabilité  en  cas   de   perte  d'information
  occasionné par LZEXE. Mais rassurez-vous, les algorithmes sont fiables et
  je ne crois pas qu'il y ait beaucoup de bugs.
    
    Attention !  Je ne vous conseille pas de  compacter et  de diffuser des
  logiciels commerciaux protégés  par un  copyright:  les  auteurs risquent
  d'êtres mécontents...
    
    Mais si  vous  faites un FREEWARE,  un SHAREWARE,  ou même un programme
  commercial,  rien ne vous empêche de le compacter avec LZEXE,  et même je
  vous le conseille:
    -  Vos fichiers EXE seront plus petits et on croira que  vos programmes
  compilés seront faits en assembleur. Que dirons vos concurrents quand ils
  verront des programmes qui font la même chose que les leurs mais 30% plus
  petits ?  De plus vous pourrez mettre  sur disquette (et sur  disque dur)
  plus de programmes, car on a toujours besoin d'une plus grande mémoire de
  masse...
    -  Le  compactage constitue un excellent codage  qui peut  empêcher des
  personnes peu recommandables de modifier les messages ou bien de voir vos
  algorithmes  secrets à moins  de  désassembler  le  décompacteur,  ce qui
  risque de n'être pas très facile, c'est moi qui vous le dit !
    
    
    Voilà,  en espérant que ce  soft vous servira et  qu'il ne  possède pas
  trop de bugs !
    
       Fabrice.
    
    Voici mon adresse si vous  voulez des  infos sur les algorithmes  ou si
  vous avez des problèmes:
    
      Fabrice BELLARD
    451 chemin du mas de Matour
        34790 GRABELS  (FRANCE)
    
    	
    
    Mon pseudo sur RTEL ou QBBS: FAB
    
    
    
    Evolution des versions:
    
    LZEXE v0.91:
    ------------
    - Le tiret "-" n'était pas accepté dans le noms de fichiers, cela a été
  corrigé.
    - LZEXE signale la présence des overlays internes.
    -  LZEXE  indique si  le  fichier a déjà  été compacté  avec EXEPACK de
  Microsoft.
    -  Un bug de  la  version 0.90  faisait  occuper  trop  de  mêmoire aux
  fichiers EXE: cela a été corrigé.
    - Le compactage de la table de relocation a été amélioré.
    - Le contrôle du CRC a été enlevé.
    - La taille du décompacteur est passée de 395 à 330 octets.
    
    
