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
00064
00065
00066
00067
00068
00069
00070
00071 #ifndef _iso9660_h
00072 #define _iso9660_h
00073
00074
00075 #define ISODCL(from, to) (to - from + 1)
00076
00077
00078
00079
00080 #define ISO9660_FIRSTINO 0
00081 #define ISO9660_ROOTINO 0
00082 #define ISO9660_NIADDR 0
00083 #define ISO9660_NDADDR 1
00084 #define ISO9660_SBOFF 32768
00085 #define ISO9660_SSIZE_B 2048
00086 #define ISO9660_MIN_BLOCK_SIZE 512
00087 #define ISO9660_MAX_BLOCK_SIZE 2048
00088 #define ISO9660_MAGIC "CD001"
00089
00090
00091 #define ISO9660_BOOT_RECORD 0
00092 #define ISO9660_PRIM_VOL_DESC 1
00093 #define ISO9660_SUPP_VOL_DESC 2
00094 #define ISO9660_VOL_PART_DESC 3
00095 #define ISO9660_RESERVE_FLOOR 4
00096 #define ISO9660_RESERVE_CEIL 254
00097 #define ISO9660_VOL_DESC_SET_TERM 255
00098
00099 #define ISO9660_MAXNAMLEN_STD 128
00100 #define ISO9660_MAXNAMLEN_JOL 128
00101 #define ISO9660_MAXNAMLEN (ISO9660_MAXNAMLEN_JOL << 1) // mult jol by 2 to account for UTF-16 to UTF-8 conversion
00102
00103
00104 #define ISO9660_BIT_UR 0x0010
00105 #define ISO9660_BIT_UX 0x0040
00106 #define ISO9660_BIT_GR 0x0100
00107 #define ISO9660_BIT_GX 0x0400
00108 #define ISO9660_BIT_AR 0x1000
00109 #define ISO9660_BIT_AX 0x4000
00110
00111
00112 #define ISO9660_FLAG_HIDE 0x01
00113 #define ISO9660_FLAG_DIR 0x02
00114 #define ISO9660_FLAG_ASSOC 0x04
00115 #define ISO9660_FLAG_RECORD 0X08
00116 #define ISO9660_FLAG_PROT 0X10
00117 #define ISO9660_FLAG_RES1 0X20
00118 #define ISO9660_FLAG_RES2 0x40
00119 #define ISO9660_FLAG_MULT 0X80
00120
00121
00122 #define MODE_IFSOCK 0140000
00123 #define MODE_IFLNK 0120000
00124 #define MODE_IFDIR 0040000
00125 #define MODE_IFIFO 0010000
00126 #define MODE_IFBLK 0060000
00127 #define MODE_IFCHR 0020000
00128
00129
00130 #define ISO9660_TYPE_PVD 0
00131 #define ISO9660_TYPE_SVD 1
00132
00133 #define ISO9660_CTYPE_ASCII 0
00134 #define ISO9660_CTYPE_UTF16 1
00135
00136
00137 typedef struct {
00138 uint8_t year;
00139 uint8_t month;
00140 uint8_t day;
00141 uint8_t hour;
00142 uint8_t min;
00143 uint8_t sec;
00144 uint8_t gmt_off;
00145 } record_data;
00146
00147
00148
00149
00150 typedef struct {
00151 uint8_t year[4];
00152 uint8_t month[2];
00153 uint8_t day[2];
00154 uint8_t hour[2];
00155 uint8_t min[2];
00156 uint8_t sec[2];
00157 uint8_t hun[2];
00158 uint8_t gmt_off;
00159 } date_time;
00160
00161
00162 typedef struct {
00163 uint8_t entry_len;
00164 uint8_t ext_len;
00165 uint8_t ext_loc_l[4];
00166 uint8_t ext_loc_m[4];
00167 uint8_t data_len_l[4];
00168 uint8_t data_len_m[4];
00169 record_data rec_time;
00170 int8_t flags;
00171 uint8_t unit_sz;
00172 uint8_t gap_sz;
00173 uint8_t seq[4];
00174 uint8_t fi_len;
00175 } iso9660_dentry;
00176
00177
00178
00179
00180
00181 typedef struct {
00182 uint8_t length;
00183 uint8_t ext_len;
00184 uint8_t ext_loc_l[4];
00185 uint8_t ext_loc_m[4];
00186 uint8_t data_len_l[4];
00187 uint8_t data_len_m[4];
00188 record_data rec;
00189 int8_t flags;
00190 uint8_t unit_sz;
00191 uint8_t gap_sz;
00192 uint8_t seq[4];
00193 uint8_t len;
00194 char name;
00195 } iso9660_root_dentry;
00196
00197
00198 typedef struct {
00199 uint8_t type;
00200 char magic[ISODCL(2, 6)];
00201 char ver[ISODCL(7, 7)];
00202 char x[ISODCL(8, 2048)];
00203 } iso9660_gvd;
00204
00205
00206 typedef struct {
00207 char unused1[ISODCL(1, 8)];
00208 char sys_id[ISODCL(9, 40)];
00209 char vol_id[ISODCL(41, 72)];
00210 char unused2[ISODCL(73, 80)];
00211 uint8_t vs_sz_l[ISODCL(81, 84)];
00212 uint8_t vs_sz_m[ISODCL(85, 88)];
00213 char unused3[ISODCL(89, 120)];
00214 uint8_t vol_set_l[ISODCL(121, 122)];
00215 uint8_t vol_set_m[ISODCL(123, 124)];
00216 uint8_t vol_seq_l[ISODCL(125, 126)];
00217 uint8_t vol_seq_m[ISODCL(127, 128)];
00218 uint8_t blk_sz_l[ISODCL(129, 130)];
00219 uint8_t blk_sz_m[ISODCL(131, 132)];
00220 uint8_t pt_size_l[ISODCL(133, 136)];
00221 uint8_t pt_size_m[ISODCL(137, 140)];
00222 uint8_t pt_loc_l[ISODCL(141, 144)];
00223 uint8_t pt_opt_loc_l[ISODCL(145, 148)];
00224 uint8_t pt_loc_m[ISODCL(149, 152)];
00225 uint8_t pt_opt_loc_m[ISODCL(153, 156)];
00226 iso9660_root_dentry dir_rec;
00227 char vol_setid[ISODCL(191, 318)];
00228 unsigned char pub_id[ISODCL(319, 446)];
00229 unsigned char prep_id[ISODCL(447, 574)];
00230 unsigned char app_id[ISODCL(575, 702)];
00231 unsigned char copy_id[ISODCL(703, 739)];
00232 unsigned char abs_id[ISODCL(740, 776)];
00233 unsigned char bib_id[ISODCL(777, 813)];
00234 date_time make_date;
00235 date_time mod_date;
00236 date_time exp_date;
00237 date_time ef_date;
00238 uint8_t fs_ver;
00239 char res[ISODCL(883, 883)];
00240 char app_use[ISODCL(884, 1395)];
00241 char reserv[ISODCL(1396, 2048)];
00242 } iso9660_pvd;
00243
00244
00245 typedef struct {
00246 uint8_t flags[ISODCL(1, 8)];
00247 char sys_id[ISODCL(9, 40)];
00248 char vol_id[ISODCL(41, 72)];
00249 char unused2[ISODCL(73, 80)];
00250 uint8_t vs_sz_l[ISODCL(81, 84)];
00251 uint8_t vs_sz_m[ISODCL(85, 88)];
00252 uint8_t esc_seq[ISODCL(89, 120)];
00253 uint8_t vol_set_l[ISODCL(121, 122)];
00254 uint8_t vol_set_m[ISODCL(123, 124)];
00255 uint8_t vol_seq_l[ISODCL(125, 126)];
00256 uint8_t vol_seq_m[ISODCL(127, 128)];
00257 uint8_t blk_sz_l[ISODCL(129, 130)];
00258 uint8_t blk_sz_m[ISODCL(131, 132)];
00259 uint8_t pt_size_l[ISODCL(133, 136)];
00260 uint8_t pt_size_m[ISODCL(137, 140)];
00261 uint8_t pt_loc_l[ISODCL(141, 144)];
00262 uint8_t pt_opt_loc_l[ISODCL(145, 148)];
00263 uint8_t pt_loc_m[ISODCL(149, 152)];
00264 uint8_t pt_opt_loc_m[ISODCL(153, 156)];
00265 iso9660_root_dentry dir_rec;
00266 char vol_setid[ISODCL(191, 318)];
00267 unsigned char pub_id[ISODCL(319, 446)];
00268 unsigned char prep_id[ISODCL(447, 574)];
00269 unsigned char app_id[ISODCL(575, 702)];
00270 unsigned char copy_id[ISODCL(703, 739)];
00271 unsigned char abs_id[ISODCL(740, 776)];
00272 unsigned char bib_id[ISODCL(777, 813)];
00273 date_time make_date;
00274 date_time mod_date;
00275 date_time exp_date;
00276 date_time ef_date;
00277 char fs_ver[ISODCL(882, 882)];
00278 char res[ISODCL(883, 883)];
00279 char app_use[ISODCL(884, 1395)];
00280 char reserv[ISODCL(1396, 2048)];
00281 } iso9660_svd;
00282
00283
00284 typedef struct {
00285 char boot_sys_id[ISODCL(8, 39)];
00286 char boot_id[ISODCL(40, 71)];
00287 char system_use[ISODCL(72, 2048)];
00288 } iso_bootrec;
00289
00290
00291 typedef struct {
00292 uint8_t len_di;
00293 uint8_t attr_len;
00294 uint8_t ext_loc[4];
00295 uint8_t par_dir[2];
00296 } path_table_rec;
00297
00298
00299 typedef struct {
00300 uint8_t uid[ISODCL(1, 4)];
00301 uint8_t gid[ISODCL(5, 8)];
00302 uint8_t mode[ISODCL(9, 10)];
00303 uint8_t cre[ISODCL(11, 27)];
00304 uint8_t mod[ISODCL(28, 44)];
00305 uint8_t exp[ISODCL(45, 61)];
00306 uint8_t eff[ISODCL(62, 78)];
00307 uint8_t fmt[ISODCL(79, 79)];
00308 uint8_t attr[ISODCL(80, 80)];
00309 uint8_t len[ISODCL(81, 84)];
00310 uint8_t sys_id[ISODCL(85, 116)];
00311 uint8_t uns[ISODCL(117, 180)];
00312 uint8_t e_ver[ISODCL(181, 181)];
00313 uint8_t len_esc[ISODCL(182, 182)];
00314 } ext_attr_rec;
00315
00316
00317 typedef struct iso9660_pvd_node {
00318 iso9660_pvd pvd;
00319 struct iso9660_pvd_node *next;
00320 } iso9660_pvd_node;
00321
00322
00323 typedef struct iso9660_svd_node {
00324 iso9660_svd svd;
00325 struct iso9660_svd_node *next;
00326 } iso9660_svd_node;
00327
00328
00329 typedef struct {
00330 uid_t uid ;
00331 gid_t gid;
00332 uint16_t mode;
00333 uint32_t nlink;
00334 char fn[ISO9660_MAXNAMLEN_STD];
00335 } rockridge_ext;
00336
00341 typedef struct {
00342 iso9660_dentry dr;
00343 ext_attr_rec *ea;
00344 char fn[ISO9660_MAXNAMLEN + 1];
00345 rockridge_ext *rr;
00346 int version;
00347 OFF_T susp_off;
00348 OFF_T susp_len;
00349 } iso9660_inode;
00350
00351
00352 typedef struct iso9660_inode_node {
00353 iso9660_inode inode;
00354 OFF_T offset;
00355 INUM_T inum;
00356 int size;
00357 int ea_size;
00358 struct iso9660_inode_node *next;
00359 } iso9660_inode_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 iso9660_pvd_node *pvd;
00369 iso9660_svd_node *svd;
00370 iso9660_inode_node *in_list;
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[2];
00389 uint8_t len;
00390 char ver;
00391 } iso9660_susp_head;
00392
00393
00395 typedef struct {
00396 char sig[2];
00397 uint8_t len;
00398 char ver;
00399 uint8_t blk_l[4];
00400 uint8_t blk_m[4];
00401 uint8_t offset_l[4];
00402 uint8_t offset_m[4];
00403 uint8_t celen_l[4];
00404 uint8_t celen_m[4];
00405 } iso9660_susp_ce;
00406
00408 typedef struct {
00409 char sig[2];
00410 uint8_t len;
00411 char ver;
00412 uint8_t chk[2];
00413 uint8_t skip;
00414 } iso9660_susp_sp;
00415
00416 typedef struct {
00417 char sig[2];
00418 uint8_t len;
00419 char ver;
00420 uint8_t len_id;
00421 uint8_t len_des;
00422 uint8_t len_src;
00423 uint8_t ext_ver;
00424 char ext_id[1];
00425
00426
00427 } iso9660_susp_er;
00428
00429
00430
00431 typedef struct {
00432 char sig[ISODCL(1, 2)];
00433 uint8_t len[ISODCL(3, 3)];
00434 uint8_t ver[ISODCL(4, 4)];
00435 uint8_t foo[ISODCL(5, 5)];
00436 } rr_sys_use;
00437
00438
00439 typedef struct {
00440 char sig[ISODCL(1, 2)];
00441 uint8_t len;
00442 uint8_t ver;
00443 uint8_t mode_l[ISODCL(5, 8)];
00444 uint8_t mode_m[ISODCL(9, 12)];
00445 uint8_t links_l[ISODCL(13, 16)];
00446 uint8_t links_m[ISODCL(17, 20)];
00447 uint8_t uid_l[ISODCL(21, 24)];
00448 uint8_t uid_m[ISODCL(25, 28)];
00449 uint8_t gid_l[ISODCL(29, 32)];
00450 uint8_t gid_m[ISODCL(23, 36)];
00451
00452
00453 } iso9660_rr_px_entry;
00454
00455
00456 typedef struct {
00457 char sig[ISODCL(1, 2)];
00458 uint8_t len;
00459 uint8_t ver;
00460 uint8_t dev_h_l[ISODCL(5, 8)];
00461 uint8_t dev_h_m[ISODCL(9, 12)];
00462 uint8_t dev_l_l[ISODCL(13, 16)];
00463 uint8_t dev_l_m[ISODCL(17, 20)];
00464 } iso9660_rr_pn_entry;
00465
00466
00467 typedef struct {
00468 char sig[ISODCL(1, 2)];
00469 uint8_t len;
00470 uint8_t ver;
00471 uint8_t flags;
00472 } iso9660_rr_sl_entry;
00473
00474
00475 typedef struct {
00476 char sig[ISODCL(1, 2)];
00477 uint8_t len;
00478 uint8_t ver[ISODCL(4, 4)];
00479 uint8_t flags[ISODCL(5, 5)];
00480 char name[1];
00481 } iso9660_rr_nm_entry;
00482
00483
00484 typedef struct {
00485 char sig[ISODCL(1, 2)];
00486 uint8_t len[ISODCL(3, 3)];
00487 uint8_t ver[ISODCL(4, 4)];
00488 uint8_t par_loc[ISODCL(5, 12)];
00489 } iso9660_rr_cl_entry;
00490
00491
00492 typedef struct {
00493 char sig[ISODCL(1, 2)];
00494 uint8_t len[ISODCL(3, 3)];
00495 uint8_t ver[ISODCL(4, 4)];
00496 } iso9660_rr_re_entry;
00497
00498
00499 typedef struct {
00500 char sig[ISODCL(1, 2)];
00501 uint8_t len[ISODCL(3, 3)];
00502 uint8_t ver[ISODCL(4, 4)];
00503 uint8_t flags[ISODCL(5, 5)];
00504 } iso9660_rr_tf_entry;
00505
00506
00507 typedef struct {
00508 char sig[ISODCL(1, 2)];
00509 uint8_t len[ISODCL(3, 3)];
00510 uint8_t ver[ISODCL(4, 4)];
00511 uint8_t vfs_h[ISODCL(5, 12)];
00512 uint8_t vfs_l[ISODCL(13, 20)];
00513 uint8_t depth[ISODCL(21, 21)];
00514 } iso9660_rr_sf_entry;
00515
00516 #endif