more work. seems there is an old version of the isz format. complicates things
[delutions.git] / isz2iso / isz-annotated.txt
blob649ec63f9c9dbacdac783246b347465600b2dcac
1 3. General Format of a .ISZ file\r
2 --------------------------------\r
3 \r
4 Large .ISZ files can span multiple disk media or be split into \r
5 user-defined segment sizes.  \r
6 \r
7 Overall .ISZ file format:\r
8 \r
9 [ISZ file header]\r
10 [Segment defination table] \r
11 [Chunk defination table] \r
12 [Chunk #1 data]\r
13 .\r
14 .\r
15 .\r
16 [Chunk #n data]\r
18 3.1 ISZ file header:\r
20 typedef struct isz_file_header {\r
21   char signature[4];            //0     //'IsZ!'
22   uint8_t header_size;  //4     // header size in bytes
23   int8_t version;               //5     // version number
24   uint32_t vsn;         //6     // volume serial number
25   uint16_t sector_sz;   //10    // sector size in bytes
26   uint32_t total_sectors;//12   // total sectors of ISO image
27   int8_t has_password;  //16    // is Password protected?
28   int64_t segment_size; //17    // size of segments in bytes
29   uint32_t nblocks;             //25    // number of chunks in image
30   uint32_t block_size;  //29    // chunk size in bytes (must be multiple of sector_size)
31   uint8_t ptr_len;              //33    // chunk pointer length
32   int8_t seg_no;                //34    /x/ segment number of this segment file, max 99
33   uint32_t ptr_offs;    //35    /x/ offset of chunk pointers, zero = none
34   uint32_t seg_offs;    //39    /x/ offset of segment pointers, zero = none
35   uint32_t data_offs;   //43    // data offset
36   int8_t reserved;              //44
37                                         //45\r
38 } isz_header;\r
40 The 'has_password' field should be one of the following values:\r
42 #define ADI_PLAIN       0        // no encryption\r
43 #define ADI_PASSWORD    1        // password protected (not used)\r
44 #define ADI_AES128      2        // AES128 encryption\r
45 #define ADI_AES192      3        // AES192 encryption\r
46 #define ADI_AES256      4        // AES256 encryption\r
48 3.2. Segment defination table (SDT)\r
50 This descriptor exists only if 'seg_offs' field of ISZ header is not zero. \r
52 Immediately following the ISZ file header to define segment information.\r
54 typedef struct isz_seg_st {\r
55   __int64 size;                  // segment size in bytes\r
56   int num_chks;                  // number of chunks in current file\r
57   int first_chkno;               // first chunk number in current file\r
58   int chk_off;                   // offset to first chunk in current file\r
59   int left_size;                 // uncompltete chunk bytes in next file\r
60 } isz_seg;\r
62 If an ISZ file is not segmented (has only one segment), no SDT should be\r
63 stored. The 'seg_offs' field in ISZ file header should be zero.\r
65 For ISZ files with N segments, N+1 SDT entries should be stored. 'size' field of \r
66 the last SDT entry should be zero. \r
68 3.3. Chunk defination table (CDT)\r
70 This descriptor exists only if 'ptr_offs' field of ISZ haeder is not zero. \r
72 Immediately following the SDT to define chunk information.\r
74 typedef struct isz_chunk_st {\r
75   chunk_flag;\r
76   blk_len;\r
77 } isz_chunk;\r
79 'chunk_flag' and 'blk_len' defination is variable according to 'ptr_len' field of \r
80 ISZ header.  \r
82 The 'chunk_flag' should be one of the following values:\r
84 #define ADI_ZERO        0x00    // all zeros chunk\r
85 #define ADI_DATA        0x40    // non-compressed data\r
86 #define ADI_ZLIB        0x80    // ZLIB compressed\r
87 #define ADI_BZ2         0xC0    // BZIP2 compressed\r
89 Number of CDT entries should equal to 'nblocks' field in ISZ header, 'blk_len'\r
90 field in CDT entry MUST be less or equal to 'block_size' in ISZ header.\r
92 3.4 Chunk data\r
94 According to 'chunk_flag' defination, a chunk may have no data (ADI_ZERO) or \r
95 'blk_len' bytes of compressed (ADI_ZLIB or ADI_BZ2) or non-compressed data (ADI_DATA)\r
97 3.5. Splitting and Spanning ISZ files\r
99 Spanning is the process of segmenting a ISZ file across multiple removable media. \r
100 This support has typically been provided for floppy diskettes, CD-R discs and DVD-R discs. \r
102 File splitting is a newer derivative of spanning. Splitting follows the same \r
103 segmentation process as spanning, however, it does not require writing each\r
104 segment to a unique removable medium and instead supports placing all pieces onto \r
105 local or non-removable locations such as file systems, local drives, folders, etc...\r
107 Split ISZ files are typically written to the same location and are subject to name \r
108 collisions if the spanned name format is used since each segment will reside on the same \r
109 drive. To avoid name collisions, split archives are named as follows.\r
111     Segment 1 = filename.isz\r
112     Segment 2 = filename.i01\r
113     Segment n = filename.i(n-1)\r
115 The .ISZ extension is used on the first segment to support quickly reading the ISO image \r
116 information directory. The segment number n should be a decimal value.\r
118     Capacities for split archives are as follows.\r
120     Maximum number of segments = 99\r
121     Minimum segment size = 100KB  \r
122     Maximum segment size = 4TB - 1 (64 bits)\r
123           \r
124 Segment sizes may be different however by convention, all segment sizes should be the same \r
125 with the exception of the last, which may be smaller. \r
127 4. Encryption Method\r
129 Only chunk data is encrypted if 'has_password' filed of ISZ header is defined.\r
131 There are three encryption method may be used: AES128, AES192 and AES256.\r
133 Reference implementations for these algorithms are available from either commercial or \r
134 open source distributors.  Readily available cryptographic toolkits make implementation of \r
135 the encryption features straight-forward.  \r
137 Encryption is always applied to a chunk after compression. The block oriented algorithms \r
138 all operate in Cypher Block Chaining (CBC) mode.  The block size used for AES encryption is 16.  \r
140 5. Compression Method\r
142 Chunk data may be compressed by ZLIB or BZIP2 method.\r
144 ZLIB is a compression library written by Jean-loup Gailly (compression) and Mark Adler (decompression).\r
145 BZIP2 is an open-source data compression algorithm developed by Julian Seward.  \r
146 Information and source code for these algorithm can be found on the internet.\r
148 The length of compressed data is defined by CDT entries, and the length of uncompressed data\r
149 is always less than 'block_size' field in ISZ header.\r
151 6. Usful Tips\r
153 1) Capacity of an ISZ file can be caculated by 'total_sectors' field ('sect_size' is always 2048 for \r
154    ISO CD/DVD images)\r
155 2) SDT and CDT are the central information of an ISZ file. Sector data can be located this way:\r
156    - Calculate chunk number by: chk_no = (sector_no * sect_size) / block_size\r
157    - Search in CDT, get chunk length and offset\r
158    - Search in SDT, get which segment file to read. For data of last chunk, you may need to read left \r
159      byte from next segment file\r
160    - Decrypt chunk data as needed\r
161    - Uncompress chunk data as needed\r
162    - Get sector data from chunk buffer \r
163 3) Sengment files may be located in differnet folder. A dialogue box for asking file location is needed \r
164    for this situation. Segment file can be verified by 'seg_no' and 'vsn' field in ISZ header.  \r
166 7. Change Process\r
167 ------------------\r
169 In order for the .ISZ file format to remain a viable definition, this specification should be \r
170 considered as open for periodic review and revision.  Although this format was originally \r
171 designed with a certain level of extensibility, not all changes in technology (present or future) \r
172 were or will be necessarily considered in its design.  If your application requires new definitions \r
173 to this format, or if you would like to submit new data structures, please forward your request to\r
174 isz@ezbsystems.com.  All submissions will be reviewed for possible inclusion into future versions \r
175 of this specification.  Periodic revisions to this specification will be published to ensure \r
176 interoperability. We encourage comments and feedback that may help improve clarity or content.\r
178 8. Incorporating ISZ format into Your Product\r
179 ------------------------------------------------------------------\r
181 EZB Systems offers a free license for certain technological aspects described above under certain restrictions \r
182 and conditions. A free SDK package is also available. Please contact EZB Systems at isz@ezbsystems.com with \r
183 regard to acquiring a license.\r