Documentation for: ------------------- LZEXE.EXE v0.91 (á-release) (c) 1989 Fabrice BELLARD Compressor for EXE files. This program is in the public domain (FREEWARE), and you can therefore use, copy and distribute it freely. You can also utilize it commercially, i.e. you can use it on programs you intend to sell. However, the sale of LZEXE.EXE itself is forbidden. Requirements: PC and compatibles. 80286 or 80386 microprocessors are recommended for greater execution speed. Memory requirements: 128K minimum are needed to run LZEXE. 1-Introduction -------------- This utility compresses EXE files, namely executable files. You know that there are many other compressors for such files, such as the excellent PKZIP or LHARC. This uniqueness of the present method consists in the fact that the compressed files can be run directly! For almost all EXE files the decompression time is so short that it is negligible ! In addition the decompression does not use any extra space on disk or in RAM. It simply uses the amount of RAM normally allocated for the uncompressed file. The compressor algorithm has been optimized not only for speed but also for efficiency: EXE files are reduced almost to the size of their ZIPped counterparts. I am working on future releases which I hope will be even better. 2-Using LZEXE ------------- Usage is very simple: just enter the command line LZEXE filename where filename is the EXE file to be compressed. The extension .EXE is implied by default. "path" is optional: it refers to the directory where the compacted file and the temporary working file LZTMP.EXE are to be located. Warning! Certain files are EXE only by name! For DOS it is not the extension EXE that characterizes an 'EXE' file, but the presence of a header with the letters "MZ" followed by information on the length of the file the space occupied in RAM, etc... Thus if you change the COM extension to EXE, LZEXE will refuse to process the file. There is a way to force LZEXE to accept a COM file: just use COMTOEXE by the same author. It works like EXE2BIN in reverse. For greater safety LZEXE does not erase the original EXE file, but it renames it with the extension .OLD. In addition it creates the temporary file LZEXE.TMP which is renamed with the name of the original program only at the end of the compression process. 3-Usage tips ------------ Certain files can not be compressed for various reasons: - The file is not a true EXE file. Solution: use COMTOEXE.EXE. - The relocation table is too large. To understand this you need to know the internal structure of an EXE file: such a file can occupy several segments unlike COM files. Thus it must contain a table specifying where to branch and where to call subprograms, etc... And if the program is rather large it may confuse the compressor. I have provided for a table with up to 16,000 relocation addresses, which should suffice for almost all EXE files. - The file you wish to compress has already been compressed by LZEXE. Notice that there exists another compressor: Microsoft's EXEPACK.EXE, which however is far less efficient than LZEXE. LZEXE can further compress an EXEPACKed file, if you use UPACKEXE to unpack what EXEPACK has done. - Sometimes the compression factor is not significant. This may happen with very small files (less than 2K). Normally the compression is quite substantial. - A more serious problem: certain compressed EXE file may hang the system: - If the program checks its size (like Turbo Debugger for example). - If it checks for its integrity on disk. - If it uses overlays, which must be loaded later and thus must occupy occupy fixed position in the file. LZEXE 0.91 warns you of the presence of such overlays. - Programs that require Microsoft's Windows: they are not true EXE and will not work properly if compressed with LZEXE. - This list may grow, since I have not experimented with all types of EXE files. - A less serious problem: Certain programs use configuration options that modify the code (Turbo Pascal, for example). In this case, first configure the program, then compress it. (Always keep an uncompressed version for safety.) 4-Some technical notes ---------------------- The compression algorithm used is based on the Ziv Lempel method, uses a circular (ring) buffer, and a tree-lile method for finding byte sequence repeats. The encoding of the position and length of the repeating sequences is optimized via an auxiliary algorithm based on the Huffman method. Uncompressed bytes are kept unchanged since any further method (such as Adaptive Huffman, as in LHARC, or Shanon-Fano trees, as in PKZIP) would have entailed a much longer decompression time, and above all, a much more complex and larger decompressor, which would have decreased excessively the compression factor. The decompressor is located at the end of the compressed EXE file and is 330 bytes long (in version 0.91). Its functions are: - Check the CRC to ensure that the file has not be tampred with (useful against viruses). If the test files, the message "CRC Error" is displayed. However, I've removed this from version 0.91 because it increased the size of the file and the time spent i decompressing. Further, the crc check was only done on the decompressor. - Locate itself in high RAM, then move the compressed code in order to leave sufficient room to the EXE file. - Decompress the code, checking that it is correct, and adjust the sgments if more than 64K (this was a hard problem, in terms of speed!). - Decompress the relocation table, and update the relocatable addresses of the EXE file. Improvements have been made in this version to getter better compression. - Run the program, updating the CS,IP,SS,SP registers. That's all!!! This decompressor is by itself a little jewel of 8086 assembler programming. It goes without saying that it was hard work. But the compressor was not much easier, particularly with regard to the updating all the pointers that the decompressor needs in order to function. 5-LZEXE and the other compressors --------------------------------- PKARC (latest version): LZEXE is much better: "crunching" (alias Shrinking for PKZIP) is outdated... PKZIP v0.92: LZEXE is better in most cases. PKZIP v1.02: better than LZEXE with large files due to "imploding", since this algorithm is a subset of mine, but the decompressor is slower than mine. On smaller files the difference is minimal. LHARC v1.01: better than LZEXE due to "freezing", but same remark as for PKZIP v1.02. LARC: LZEXE is better. Important notes: - One can not truly compare LZEXE with these other products. since the files compressed with my method contain a decompressor which runs the programs by itself. It is true that the other compressor can create "self-extracting" files, but they do so on disk, are slow and add sveral scores of K to the compressed files (except for PKARC and LHARC, which add only 1 or 2K., but only decompress to disk, unfortunately.) - In almost all cases. the compressors mentioned can not further compress a file already compressed with LZEXE, which demonstrates the high efficiency of thismethod. 6-The future... --------------- - I want to develop soon a decompressor which allows the recreation of the original EXE file from the compressed one. Its usefulness is questionable, - I intend to optimize further the decompressor for speed, and the compressor for efficiency, by further reducing the relocation table, for example (I already have a few ideas...); adding a password system, and creating an 80836 version which should speed things quite abit. - I intend to develop a decompressor for Microsoft's EXEPACKed files, which is interesting because my compressor works better on files which have not been treated with EXEPACK. - I am also thinking of an automatic document-decompressor of the LIZEMOI.COM or LIST.COM type, which should be very handy. - Finally, I hope to create a "universal" compressor, like PKZIP or LHARC, slower than LZEXE in decompression, but better than the existing ones. 7-Warnings... ------------- I hope that LZEXE and the files it can create may become very popular... a good incentive for further work. I shall not be responsible in any way for any loss of data caused by LZEXE> But rest assured: the algorithms are reliable and I do not believe there are many bugs. If the EXE program created by LZEXE functions properly the first time, then it will always do so! Warning! I advise against compressing and distributing commercial software protected by copyright. The authors may not like it... But if you create a piece of FREEWARE or SHAREWARE, or even a commercial product, nothing prevents you from compressing it with LZEXE. In fact, I urge youto do so: - Your EXE files will be smaller and people may even think you programmed them in assembler. Your competitors will be amazed by your software, which does what their does butis 30% smaller. In addition you will have more space on your floppy and hard disks. Space is always at a premium... - Compressed programs are always less vulnerable to viruses, since any interference will cause the "CRC error" to appear or the system to hang. - The compression constitutes an excellent encryption system, preventing unscrupulous people from hacking your messages or examine your algorithms. The only way would be to disassemble the decompressor, which is not going to be easy, I tell you! That's it! I hope you enjoy this utility. Please remember it is still in its á-state! Fabrice. If you would like more information on the algorithms used, or in case of difficulties, here is my address: Fabrice BELLARD 451 chemin du mas de Matour 34790 GRABELS (FRANCE) Changes in v0.91: ---------------- -The dash, "-", is now acceptable character in file names. -LZEXE now points out the presence of internal overlays -LZEXE indicates if the file has been packed with EXEPACK -A bug under v0.90 has been fixed. It made programs occupy too much memory when running. -The relocation table has been improved -CRC control has been removed -The compression tail's size has been reduced from 385 to 330 bytes.