00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 #ifndef _iso9660_h
00068 #define _iso9660_h
00069
00070
00071 #define ISODCL(from, to) (to - from + 1)
00072
00073
00074
00075
00076 #define ISO9660_FIRSTINO 0
00077 #define ISO9660_ROOTINO 0
00078 #define ISO9660_NIADDR 0
00079 #define ISO9660_NDADDR 1
00080 #define ISO9660_SBOFF 32768
00081 #define ISO9660_SSIZE_B 2048
00082 #define ISO9660_MIN_BLOCK_SIZE 512
00083 #define ISO9660_MAX_BLOCK_SIZE 2048
00084 #define ISO9660_MAGIC "CD001"
00085
00086
00087 #define ISO9660_BOOT_RECORD 0
00088 #define ISO9660_PRIM_VOL_DESC 1
00089 #define ISO9660_SUPP_VOL_DESC 2
00090 #define ISO9660_VOL_PART_DESC 3
00091 #define ISO9660_RESERVE_FLOOR 4
00092 #define ISO9660_RESERVE_CEIL 254
00093 #define ISO9660_VOL_DESC_SET_TERM 255
00094
00095 #define ISO9660_MAXNAMLEN 103
00096
00097
00098 #define ISO9660_BIT_UR 0x0010
00099 #define ISO9660_BIT_UX 0x0040
00100 #define ISO9660_BIT_GR 0x0100
00101 #define ISO9660_BIT_GX 0x0400
00102 #define ISO9660_BIT_AR 0x1000
00103 #define ISO9660_BIT_AX 0x4000
00104
00105
00106 #define ISO9660_FLAG_HIDE 0x01
00107 #define ISO9660_FLAG_DIR 0x02
00108 #define ISO9660_FLAG_ASSOC 0x04
00109 #define ISO9660_FLAG_RECORD 0X08
00110 #define ISO9660_FLAG_PROT 0X10
00111 #define ISO9660_FLAG_RES1 0X20
00112 #define ISO9660_FLAG_RES2 0x40
00113 #define ISO9660_FLAG_MULT 0X80
00114
00115
00116 #define MODE_IFSOCK 0140000
00117 #define MODE_IFLNK 0120000
00118 #define MODE_IFDIR 0040000
00119 #define MODE_IFIFO 0010000
00120 #define MODE_IFBLK 0060000
00121 #define MODE_IFCHR 0020000
00122
00123
00124 #define ISO9660_TYPE_PVD 0
00125 #define ISO9660_TYPE_SVD 1
00126
00127
00128
00129
00130 #define parseu16(foo, x) \
00131 (uint16_t)( (foo->endian & TSK_LIT_ENDIAN) ? \
00132 ((uint16_t) \
00133 ((uint16_t)((uint8_t *)(x))[0] << 0) + \
00134 ((uint16_t)((uint8_t *)(x))[1] << 8)) \
00135 : \
00136 ((uint16_t) \
00137 ((uint16_t)((uint8_t *)(x))[2] << 8) + \
00138 ((uint16_t)((uint8_t *)(x))[3] << 0)) )
00139
00140 #define parseu32(foo, x) \
00141 (uint32_t)( (foo->endian & TSK_LIT_ENDIAN) ? \
00142 ((uint32_t) \
00143 ((uint32_t)((uint8_t *)(x))[0] << 0) + \
00144 ((uint32_t)((uint8_t *)(x))[1] << 8) + \
00145 ((uint32_t)((uint8_t *)(x))[2] << 16) + \
00146 ((uint32_t)((uint8_t *)(x))[3] << 24)) \
00147 : \
00148 ((uint32_t) \
00149 ((uint32_t)((uint8_t *)(x))[7] << 0) + \
00150 ((uint32_t)((uint8_t *)(x))[6] << 8) + \
00151 ((uint32_t)((uint8_t *)(x))[5] << 16) + \
00152 ((uint32_t)((uint8_t *)(x))[4] << 24)) )
00153
00154
00155
00156 typedef struct {
00157 uint8_t year;
00158 uint8_t month;
00159 uint8_t day;
00160 uint8_t hour;
00161 uint8_t min;
00162 uint8_t sec;
00163 uint8_t gmt_off;
00164 } record_data;
00165
00166
00167
00168
00169 typedef struct {
00170 uint8_t year[4];
00171 uint8_t month[2];
00172 uint8_t day[2];
00173 uint8_t hour[2];
00174 uint8_t min[2];
00175 uint8_t sec[2];
00176 uint8_t hun[2];
00177 uint8_t gmt_off;
00178 } date_time;
00179
00180
00181 typedef struct {
00182 uint8_t length;
00183 uint8_t ext_len;
00184 uint8_t ext_loc[8];
00185 uint8_t data_len[8];
00186 record_data rec;
00187 int8_t flags;
00188 uint8_t unit_sz;
00189 uint8_t gap_sz;
00190 uint8_t seq[4];
00191 uint8_t len;
00192 } iso9660_dentry;
00193
00194
00195
00196
00197
00198 typedef struct {
00199 uint8_t length;
00200 uint8_t ext_len;
00201 uint8_t ext_loc[8];
00202 uint8_t data_len[8];
00203 record_data rec;
00204 int8_t flags;
00205 uint8_t unit_sz;
00206 uint8_t gap_sz;
00207 uint8_t seq[4];
00208 uint8_t len;
00209 char name;
00210 } iso9660_root_dentry;
00211
00212
00213 typedef struct {
00214 uint8_t type;
00215 char magic[ISODCL(2, 6)];
00216 char ver[ISODCL(7, 7)];
00217 } iso_vd;
00218
00219
00220 typedef struct {
00221 char unused1[ISODCL(8, 8)];
00222 char sys_id[ISODCL(9, 40)];
00223 char vol_id[ISODCL(41, 72)];
00224 char unused2[ISODCL(73, 80)];
00225 uint8_t vol_spc[ISODCL(81, 88)];
00226 char unused3[ISODCL(89, 120)];
00227 uint8_t vol_set[ISODCL(121, 124)];
00228 uint8_t vol_seq[ISODCL(125, 128)];
00229 uint8_t blk_sz[ISODCL(129, 132)];
00230 uint8_t path_size[ISODCL(133, 140)];
00231 uint8_t loc_l[ISODCL(141, 144)];
00232 uint8_t opt_loc_l[ISODCL(145, 148)];
00233 uint8_t loc_m[ISODCL(149, 152)];
00234 uint8_t opt_loc_m[ISODCL(153, 156)];
00235 iso9660_root_dentry dir_rec;
00236 char vol_setid[ISODCL(191, 318)];
00237 unsigned char pub_id[ISODCL(319, 446)];
00238 unsigned char prep_id[ISODCL(447, 574)];
00239 unsigned char app_id[ISODCL(575, 702)];
00240 unsigned char copy_id[ISODCL(703, 739)];
00241 unsigned char abs_id[ISODCL(740, 776)];
00242 unsigned char bib_id[ISODCL(777, 813)];
00243 date_time make_date;
00244 date_time mod_date;
00245 date_time exp_date;
00246 date_time ef_date;
00247 uint8_t fs_ver;
00248 char res[ISODCL(883, 883)];
00249 char app_use[ISODCL(884, 1395)];
00250 char reserv[ISODCL(1396, 2048)];
00251 } iso_pvd;
00252
00253
00254 typedef struct {
00255 uint8_t flags[ISODCL(8, 8)];
00256 char sys_id[ISODCL(9, 40)];
00257 char vol_id[ISODCL(41, 72)];
00258 char unused2[ISODCL(73, 80)];
00259 uint8_t vol_spc[ISODCL(81, 88)];
00260 uint8_t esc_seq[ISODCL(89, 120)];
00261 uint8_t vol_set[ISODCL(121, 124)];
00262 uint8_t vol_seq[ISODCL(125, 128)];
00263 uint8_t blk_sz[ISODCL(129, 132)];
00264 uint8_t path_size[ISODCL(133, 140)];
00265 uint8_t loc_l[ISODCL(141, 144)];
00266 uint8_t opt_loc_l[ISODCL(145, 148)];
00267 uint8_t loc_m[ISODCL(149, 152)];
00268 uint8_t opt_loc_m[ISODCL(153, 156)];
00269 iso9660_root_dentry dir_rec;
00270 char vol_setid[ISODCL(191, 318)];
00271 unsigned char pub_id[ISODCL(319, 446)];
00272 unsigned char prep_id[ISODCL(447, 574)];
00273 unsigned char app_id[ISODCL(575, 702)];
00274 unsigned char copy_id[ISODCL(703, 739)];
00275 unsigned char abs_id[ISODCL(740, 776)];
00276 unsigned char bib_id[ISODCL(777, 813)];
00277 date_time make_date;
00278 date_time mod_date;
00279 date_time exp_date;
00280 date_time ef_date;
00281 char fs_ver[ISODCL(882, 882)];
00282 char res[ISODCL(883, 883)];
00283 char app_use[ISODCL(884, 1395)];
00284 char reserv[ISODCL(1396, 2048)];
00285 } iso_svd;
00286
00287
00288 typedef struct {
00289 char boot_sys_id[ISODCL(8, 39)];
00290 char boot_id[ISODCL(40, 71)];
00291 char system_use[ISODCL(72, 2048)];
00292 } iso_bootrec;
00293
00294
00295 typedef struct {
00296 uint8_t len_di;
00297 uint8_t attr_len;
00298 uint8_t ext_loc[4];
00299 uint8_t par_dir[2];
00300 } path_table_rec;
00301
00302
00303 typedef struct {
00304 uint8_t uid[ISODCL(1, 4)];
00305 uint8_t gid[ISODCL(5, 8)];
00306 uint8_t mode[ISODCL(9, 10)];
00307 uint8_t cre[ISODCL(11, 27)];
00308 uint8_t mod[ISODCL(28, 44)];
00309 uint8_t exp[ISODCL(45, 61)];
00310 uint8_t eff[ISODCL(62, 78)];
00311 uint8_t fmt[ISODCL(79, 79)];
00312 uint8_t attr[ISODCL(80, 80)];
00313 uint8_t len[ISODCL(81, 84)];
00314 uint8_t sys_id[ISODCL(85, 116)];
00315 uint8_t uns[ISODCL(117, 180)];
00316 uint8_t e_ver[ISODCL(181, 181)];
00317 uint8_t len_esc[ISODCL(182, 182)];
00318 } ext_attr_rec;
00319
00320
00321 typedef struct pvd_node {
00322 iso_pvd pvd;
00323 struct pvd_node *next;
00324 } pvd_node;
00325
00326
00327 typedef struct svd_node {
00328 iso_svd svd;
00329 struct svd_node *next;
00330 } svd_node;
00331
00332
00333 typedef struct {
00334 uid_t uid ;
00335 gid_t gid;
00336 uint16_t mode;
00337 uint32_t nlink;
00338 char fn[ISO9660_MAXNAMLEN];
00339 } rockridge_ext;
00340
00341
00342
00343
00344 typedef struct {
00345 iso9660_dentry dr;
00346 ext_attr_rec *ea;
00347 char fn[ISO9660_MAXNAMLEN];
00348 rockridge_ext *rr;
00349 int version;
00350 } iso9660_inode;
00351
00352
00353 typedef struct in_node {
00354 iso9660_inode inode;
00355 OFF_T offset;
00356 INUM_T inum;
00357 int size;
00358 struct in_node *next;
00359 } in_node;
00360
00361
00362 typedef struct {
00363 TSK_FS_INFO fs_info;
00364 INUM_T dinum;
00365 iso9660_inode *dinode;
00366 uint32_t path_tab_addr;
00367 uint32_t root_addr;
00368 pvd_node *pvd;
00369 svd_node *svd;
00370 in_node *in;
00371 uint8_t rr_found;
00372 } ISO_INFO;
00373
00374 extern uint8_t iso9660_dent_walk(TSK_FS_INFO * fs, INUM_T inode,
00375 TSK_FS_DENT_FLAG_ENUM flags, TSK_FS_DENT_TYPE_WALK_CB action,
00376 void *ptr);
00377
00378 extern uint8_t iso9660_dinode_load(ISO_INFO * iso, INUM_T inum);
00379
00380
00381
00382
00383
00384
00385
00386
00387 typedef struct {
00388 char sig[ISODCL(1, 2)];
00389 uint8_t len[ISODCL(3, 3)];
00390 uint8_t ver[ISODCL(4, 4)];
00391 uint8_t blk_loc[ISODCL(5, 12)];
00392 uint8_t offs[ISODCL(13, 20)];
00393 uint8_t len_c[ISODCL(21, 28)];
00394
00395 } ce_sys_use;
00396
00397
00398 typedef struct {
00399 char sig[ISODCL(1, 2)];
00400 uint8_t len[ISODCL(3, 3)];
00401 uint8_t ver[ISODCL(4, 4)];
00402 uint8_t check[ISODCL(5, 6)];
00403 uint8_t skip[ISODCL(7, 7)];
00404 } sp_sys_use;
00405
00406
00407 typedef struct {
00408 char sig[ISODCL(1, 2)];
00409 uint8_t len[ISODCL(3, 3)];
00410 uint8_t ver[ISODCL(4, 4)];
00411 uint8_t foo[ISODCL(5, 5)];
00412 } rr_sys_use;
00413
00414
00415 typedef struct {
00416 char sig[ISODCL(1, 2)];
00417 uint8_t len[ISODCL(3, 3)];
00418 uint8_t ver[ISODCL(4, 4)];
00419 uint8_t mode[ISODCL(5, 12)];
00420 uint8_t links[ISODCL(13, 20)];
00421 uint8_t uid[ISODCL(21, 28)];
00422 uint8_t gid[ISODCL(29, 36)];
00423
00424
00425 } rr_px_entry;
00426
00427
00428 typedef struct {
00429 char sig[ISODCL(1, 2)];
00430 uint8_t len[ISODCL(3, 3)];
00431 uint8_t ver[ISODCL(4, 4)];
00432 uint8_t devt_h[ISODCL(5, 12)];
00433 uint8_t devt_l[ISODCL(13, 20)];
00434 } rr_pn_entry;
00435
00436
00437 typedef struct {
00438 char sig[ISODCL(1, 2)];
00439 uint8_t len[ISODCL(3, 3)];
00440 uint8_t ver[ISODCL(4, 4)];
00441 uint8_t flags[ISODCL(5, 5)];
00442 } rr_sl_entry;
00443
00444
00445 typedef struct {
00446 char sig[ISODCL(1, 2)];
00447 uint8_t len[ISODCL(3, 3)];
00448 uint8_t ver[ISODCL(4, 4)];
00449 uint8_t flags[ISODCL(5, 5)];
00450 } rr_nm_entry;
00451
00452
00453 typedef struct {
00454 char sig[ISODCL(1, 2)];
00455 uint8_t len[ISODCL(3, 3)];
00456 uint8_t ver[ISODCL(4, 4)];
00457 uint8_t par_loc[ISODCL(5, 12)];
00458 } rr_cl_entry;
00459
00460
00461 typedef struct {
00462 char sig[ISODCL(1, 2)];
00463 uint8_t len[ISODCL(3, 3)];
00464 uint8_t ver[ISODCL(4, 4)];
00465 } rr_re_entry;
00466
00467
00468 typedef struct {
00469 char sig[ISODCL(1, 2)];
00470 uint8_t len[ISODCL(3, 3)];
00471 uint8_t ver[ISODCL(4, 4)];
00472 uint8_t flags[ISODCL(5, 5)];
00473 } rr_tf_entry;
00474
00475
00476 typedef struct {
00477 char sig[ISODCL(1, 2)];
00478 uint8_t len[ISODCL(3, 3)];
00479 uint8_t ver[ISODCL(4, 4)];
00480 uint8_t vfs_h[ISODCL(5, 12)];
00481 uint8_t vfs_l[ISODCL(13, 20)];
00482 uint8_t depth[ISODCL(21, 21)];
00483 } rr_sf_entry;
00484
00485 #endif