home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 August - Disc 3 / chip_20018103_hu.iso / segedlet / arj270.exe / TECHNOTE.TXT < prev    next >
Text File  |  1999-09-30  |  14KB  |  317 lines

  1.  
  2.      ARJ TECHNICAL INFORMATION                              September 1999
  3.  
  4.  
  5.      ** IMPORTANT NEWS ****************************************************
  6.  
  7.      Some archiver support programs have designed ARJ archive
  8.      identification schemes that are not reliable.  At ARJ 2.50, there
  9.      are now three versions of the ARJSFX self-extraction module.  The
  10.      18K byte ARJSFX module and the larger ARJSFXV module support
  11.      ARJ-SECURITY.  The standard 16K byte ARJSFX module does NOT support
  12.      ARJ-SECURITY.  For the first time, the ARJ-SECURITY fields in the
  13.      main ARJ header are publicly defined.
  14.  
  15.      In addition, the main ARJ header in self-extracting archives MAY NOT
  16.      immediately follow the EXE module now.
  17.  
  18.      ARJ has used the same ARJ archive identification scheme since ARJ
  19.      1.0.  The following is the algorithm:
  20.  
  21.      (1) find the ARJ header id bytes 0x60, 0xEA,
  22.      (2) read the next two bytes as the header record size in bytes,
  23.      (3) if the record size is greater than 2600, go back to the header
  24.          id file position, increment the file position, and go back to
  25.          step (1),
  26.      (4) read the header record based upon the previous byte count,
  27.      (5) calculate the 32 bit CRC of the header record data,
  28.      (6) read the next four bytes as the actual header record CRC,
  29.      (7) if the actual CRC does not equal the calculated CRC, go back
  30.          to the header id file position, increment the file position,
  31.          and go back to step (1).
  32.  
  33.      It is acceptable to start this identification algorithm at a point
  34.      just after the ARJ self-extraction EXE portion of an archive.  This
  35.      algorithm is fully demonstrated in the UNARJ C source code. A portion
  36.      of that source code is excerpted at the end of this document.
  37.  
  38.      As of ARJ 2.10, the SFX executable modules are pre-compressed
  39.      using LZEXE.  This may cause false indications with EXE scanning
  40.      programs showing that an ARJ SFX archive is a LZEXE compressed
  41.      file.  Only the executable header module is LZEXE compressed.
  42.      The actual archive is ARJ compressed, of course.  The LZEXE
  43.      header is modified to avoid extraction by UNLZEXE type programs.
  44.      UNLZEXE may truncate an ARJ self-extractor of its archive.
  45.  
  46.      All SFX modules have an identification string located in the
  47.      first 1000 characters of the executable.  The identification
  48.      string is "aRJsfX" without the quotes and in the exact case.
  49.  
  50.      When using listfiles with ARJ, ARJ support programs should use the
  51.      "-p" option to ensure that ARJ will only extract the selected files
  52.      from an ARJ archive.  In addition, the listfiles should contain the
  53.      full pathname information as stored in the ARJ archive.  This avoids
  54.      the problem accessing files that have the same filename but different
  55.      paths.
  56.  
  57.      There is an extended header bug in older versions of ARJ, AV.C and
  58.      UNARJ.C.  The extended header processing in read_header() should
  59.      skip 4 bytes for the extended header CRC and not 2.  This is NOT a
  60.      current problem as no versions of ARJ use the extended header.
  61.  
  62.      **********************************************************************
  63.  
  64.  
  65.      Modification history:
  66.      Date      Description of modification:
  67.      --------  ------------------------------------------------------------
  68.      08/07/99  Added new ARJPROTECT flag and protection factor.
  69.                Increased main archive header by four bytes.
  70.      01/01/99  Added new ANSIPAGE flag to replace old security flag.
  71.      11/24/98  Added new file header format.
  72.      07/16/98  Added new encryption scheme.
  73.      03/11/97  Added methods 8 and 9.
  74.      06/21/96  Added information about new encryption scheme.
  75.      04/11/96  Added information about chapters. Obsoleted backup files.
  76.      07/07/95  Added information about SFX id string.
  77.      11/03/94  Improved SFX identification information.
  78.      01/21/94  Added find_header() routine.
  79.      03/17/93  Added information about ARJSFX change.
  80.      02/17/93  Added description of ARJ security fields.
  81.                Added archive date-modified field.
  82.      12/03/91  Added BACKUP flag to header arj flags.
  83.      11/21/91  Described the two types of headers separately.
  84.      11/11/91  Added information about the change in text mode processing.
  85.      06/28/91  Added several new HOST OS numbers.
  86.      05/19/91  Improved the description of extended header processing.
  87.      05/11/91  Simplified this document.  Added volume label type.
  88.      03/11/91  Added directory file type.
  89.      02/23/91  Added more comments.
  90.      01/10/91  Corrected timestamp description and header order of file mode.
  91.      10/30/90  Corrected values of flags in ARJ flags.
  92.  
  93.  
  94.      ARJ archives contains three types of header blocks:
  95.  
  96.         Archive main header - This is located at the head of the archive
  97.         Local file header   - This is located before each archived file
  98.         Chapter header      - This is usually located each series of
  99.                               chapter files.
  100.  
  101.      Structure of main header (low order byte first):
  102.  
  103.      Bytes Description
  104.      ----- -------------------------------------------------------------------
  105.        2   header id (main and local file) = 0x60 0xEA
  106.        2   basic header size (from 'first_hdr_size' thru 'comment' below)
  107.                  = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1
  108.                  = 0 if end of archive
  109.                  maximum header size is 2600
  110.  
  111.        1   first_hdr_size (size up to and including 'extra data')
  112.        1   archiver version number
  113.        1   minimum archiver version to extract
  114.        1   host OS   (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MAC-OS)
  115.                      (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT)
  116.                      (9 = VAX VMS, 10 = WIN95)
  117.        1   arj flags
  118.                      (0x01 = GARBLED_FLAG)
  119.                      (0x02 = OLD_SECURED_FLAG) obsolete
  120.                      (0x02 = ANSIPAGE_FLAG) indicates ANSI codepage used by
  121.                                             ARJ32 
  122.                      (0x04 = VOLUME_FLAG)   indicates presence of succeeding
  123.                                             volume
  124.                      (0x08 = ARJPROT_FLAG)
  125.                      (0x10 = PATHSYM_FLAG)  indicates archive name translated
  126.                                             ("\" changed to "/")
  127.                      (0x20 = BACKUP_FLAG)   obsolete
  128.                      (0x40 = SECURED_FLAG)
  129.                      (0x80 = ALTNAME_FLAG)  indicates dual-name archive
  130.        1   security version (2 = current)
  131.        1   file type        (must equal 2)
  132.        1   reserved
  133.        4   date time when original archive was created
  134.        4   date time when archive was last modified
  135.        4   archive size (currently used only for secured archives)
  136.        4   security envelope file position
  137.        2   filespec position in filename
  138.        2   length in bytes of security envelope data
  139.        1   encryption version (0 and 1 = old, 2 = new)
  140.                               (3 = reserved)
  141.                               (4 = 40 bit key GOST)
  142.        1   last chapter
  143.     
  144.        ?   extra data
  145.            1   arj protection factor
  146.            3   spare bytes
  147.  
  148.        ?   filename of archive when created (null-terminated string)
  149.        ?   archive comment  (null-terminated string)
  150.  
  151.        4   basic header CRC
  152.  
  153.        2   1st extended header size (0 if none)
  154.        ?   1st extended header (currently not used)
  155.        4   1st extended header's CRC (not present when 0 extended header size)
  156.  
  157.  
  158.      Structure of local file header (low order byte first):
  159.  
  160.      Bytes Description
  161.      ----- -------------------------------------------------------------------
  162.        2   header id (main and local file) = 0x60 0xEA
  163.        2   basic header size (from 'first_hdr_size' thru 'comment' below)
  164.                  = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1
  165.                  = 0 if end of archive
  166.                  maximum header size is 2600
  167.  
  168.        1   first_hdr_size (size up to and including 'extra data')
  169.        1   archiver version number
  170.        1   minimum archiver version to extract
  171.        1   host OS   (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MAC-OS)
  172.                      (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT)
  173.                      (9 = VAX VMS, 10 = WIN95)
  174.        1   arj flags (0x01 = GARBLED_FLAG) indicates passworded file
  175.                      (0x02 = NOT USED)
  176.                      (0x04 = VOLUME_FLAG)  indicates continued file to next
  177.                                            volume (file is split)
  178.                      (0x08 = EXTFILE_FLAG) indicates file starting position
  179.                                            field (for split files)
  180.                      (0x10 = PATHSYM_FLAG) indicates filename translated
  181.                                            ("\" changed to "/")
  182.                      (0x20 = BACKUP_FLAG)  obsolete
  183.        1   method    (0 = stored, 1 = compressed most ... 4 compressed fastest)
  184.                      (8 = no data, no CRC, 9= no data)
  185.        1   file type (0 = binary,    1 = 7-bit text)
  186.                      (3 = directory, 4 = volume label)
  187.                      (5 = chapter label)
  188.        1   reserved
  189.        4   date time modified
  190.        4   compressed size
  191.        4   original size (this will be different for text mode compression)
  192.        4   original file's CRC
  193.        2   filespec position in filename
  194.        2   file access mode
  195.        1   first chapter of file's lifespan
  196.        1   last chapter of file's lifespan
  197.        ?   extra data
  198.            4 bytes for extended file position
  199.            
  200.            the following twelve bytes may be present in ARJ 2.62 and above
  201.            4 bytes for date-time accessed
  202.            4 bytes for date-time created
  203.            4 spare bytes (reserved)
  204.  
  205.  
  206.        ?   filename (null-terminated string)
  207.        ?   comment  (null-terminated string)
  208.  
  209.        4   basic header CRC
  210.  
  211.        2   1st extended header size (0 if none)
  212.        ?   1st extended header (currently not used)
  213.        4   1st extended header's CRC (not present when 0 extended header size)
  214.  
  215.        ...
  216.  
  217.        ?   compressed file
  218.  
  219.  
  220.      Structure of archive chapter header (low order byte first):
  221.  
  222.      Bytes Description
  223.      ----- -------------------------------------------------------------------
  224.        2  header id (comment and local file) = 0xEA60 or 60000U
  225.        2  basic header size (from 'first_hdr_size' thru 'comment' below)
  226.                 = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1
  227.                 = 0 if end of archive
  228.  
  229.        1  first_hdr_size (size up to 'extra data')
  230.        1  archiver version number
  231.        1  minimum archiver version to extract
  232.        1  host OS   (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MACDOS)
  233.                     (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT)
  234.                      (9 = VAX VMS, 10 = WIN95)
  235.        1  arj flags (0x01 = GARBLED_FLAG, 0x02 = RESERVED)
  236.                     (0x04 = VOLUME_FLAG,  0x08 = EXTFILE_FLAG)
  237.                     (0x10 = PATHSYM_FLAG,
  238.                     (0x20 = BACKUP_FLAG)   OBSOLETE < 2.50a
  239.                     (0x40 = RESERVED)
  240.        1  method    (0 = stored, 1 = compressed most ... 4 compressed fastest)
  241.        1  file type (0 = binary, 1 = text, 2 = comment header, 3 = directory)
  242.                     (4 = label, 5 = chapter)
  243.        1  ?
  244.        4  date time stamp created
  245.        4  ?
  246.        4  ?
  247.        4  original file's CRC
  248.        2  entryname position in filename
  249.        2  file access mode
  250.        1  chapter range start
  251.        1  chapter range end
  252.        ?  extra data
  253.           4 bytes for extended file position
  254.  
  255.        ?  filename (null-terminated)
  256.        ?  comment  (null-terminated)
  257.  
  258.        4  basic header CRC
  259.  
  260.        2  1st extended header size (0 if none)
  261.        ?  1st extended header
  262.        4  1st extended header's CRC
  263.  
  264.        ...
  265.  
  266.  
  267.      Time stamp format:
  268.  
  269.         31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
  270.        |<---- year-1980 --->|<- month ->|<--- day ---->|
  271.  
  272.         15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
  273.        |<--- hour --->|<---- minute --->|<- second/2 ->|
  274.  
  275.  
  276.      Routine to find an ARJ Header record:
  277.  
  278.        long find_header(FILE *fd)
  279.        {
  280.            long arcpos, lastpos;
  281.            int c;
  282.  
  283.            arcpos = file_tell(fd);
  284.            file_seek(fd, 0L, SEEK_END);
  285.            lastpos = file_tell(fd) - 2;
  286.            for ( ; arcpos < lastpos; arcpos++)
  287.            {
  288.                file_seek(fd, arcpos, SEEK_SET);
  289.                c = fget_byte(fd);
  290.                while (arcpos < lastpos)
  291.                {
  292.                    if (c != HEADER_ID_LO)  /* low order first */
  293.                        c = fget_byte(fd);
  294.                    else if ((c = fget_byte(fd)) == HEADER_ID_HI)
  295.                        break;
  296.                    arcpos++;
  297.                }
  298.                if (arcpos >= lastpos)
  299.                    break;
  300.                if ((headersize = fget_word(fd)) <= HEADERSIZE_MAX)
  301.                {
  302.                    crc = CRC_MASK;
  303.                    fread_crc(header, (int) headersize, fd);
  304.                    if ((crc ^ CRC_MASK) == fget_crc(fd))
  305.                    {
  306.                        file_seek(fd, arcpos, SEEK_SET);
  307.                        return arcpos;
  308.                    }
  309.                }
  310.            }
  311.            return -1;          /* could not find a valid header */
  312.        }
  313.  
  314.  
  315.      end of document
  316.  
  317.