1 /******************************************************************************
4 * Copyright (c) 2020, longpanda <admin@ventoy.net>
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 3 of the
9 * License, or (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see <http://www.gnu.org/licenses/>.
21 #ifndef __BISO_9660_H__
22 #define __BISO_9660_H__
24 #define BISO_SECTOR_SIZE 2048
26 #define BISO_BLOCK_SIZE 2048
28 #define BISO_SYSTEM_AREA_SIZE (16 * BISO_SECTOR_SIZE)
30 /* Volume Descriptor */
31 #define BISO_VD_TYPE_BOOT 0
32 #define BISO_VD_TYPE_PVD 1
33 #define BISO_VD_TYPE_SVD 2
34 #define BISO_VD_TYPE_PART 3
35 #define BISO_VD_TYPE_END 255
37 #define BISO_VD_ID "CD001"
39 #define BISO_USED_SECTOR_NUM(uiFileSize) \
40 (uiFileSize / BISO_SECTOR_SIZE) + ((uiFileSize % BISO_SECTOR_SIZE > 0) ? 1 : 0)
42 #define BISO_9660_IS_CURRENT(pstDirRecord) \
43 (((1 == pstDirRecord->ucNameLen) && (0x0 == pstDirRecord->szName[0])) ? BOOL_TRUE : BOOL_FALSE)
45 #define BISO_9660_IS_PARENT(pstDirRecord) \
46 (((1 == pstDirRecord->ucNameLen) && (0x1 == pstDirRecord->szName[0])) ? BOOL_TRUE : BOOL_FALSE)
48 #define BISO_9600_FREE_STAT(pstDir) \
50 if (NULL != pstDir->pstDirStat) \
52 BISO_FREE(pstDir->pstDirStat); \
56 #define BISO_9600_FREE_POSIX(pstDir) \
58 if (NULL != pstDir->pstPosixInfo) \
60 if (NULL != pstDir->pstPosixInfo->pcLinkSrc) \
62 BISO_FREE(pstDir->pstPosixInfo->pcLinkSrc); \
64 BISO_FREE(pstDir->pstPosixInfo); \
68 #define BISO_9600_FREE_DIRTREE(pstDir) \
70 BISO_9600_FREE_STAT(pstDir); \
71 BISO_9600_FREE_POSIX(pstDir); \
75 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
77 #define BISO_DEF_723(usData) \
81 #define BISO_DEF_733(uiData) \
85 #define BISO_PATHTBL_LOCATION(pstPVD) (pstPVD->uiTypeLPathTblLoc)
87 #elif (__BYTE_ORDER == __BIG_ENDIAN)
89 #define BISO_DEF_723(usData) \
93 #define BISO_DEF_733(uiData) \
97 #define BISO_PATHTBL_LOCATION(pstPVD) (pstPVD->uiTypeMPathTblLoc)
100 #error ("you must first define __BYTE_ORDER !!!")
105 typedef struct tagBISO_DATE_915
107 UCHAR ucYear
; /* 1900+ */
116 typedef struct tagBISO_PATH_TABLE
120 UCHAR ucExtAttrRecordLen
;
124 UINT16 usParentDirNum
;
128 /* UCHAR ucPadding; */
131 #define BISO_9660_PATH_LEN(pstPath) (pstPath->ucDirNameLen + 8 + (pstPath->ucDirNameLen & 0x01))
133 typedef struct tagBISO_DIR_RECORD
139 BISO_DEF_733(uiExtent
)
143 BISO_DATE_915_S stDate
;
147 UCHAR ucFileUnitSize
;
151 BISO_DEF_723(uiVolumeSeqNum
)
157 /* UCHAR aucSystemUse[xxxx] */
160 #define BISO_DIR_RECORD_IS_PATH(pstDirRecord) \
161 ((1 == ((pstDirRecord->ucFlags >> 1) & 0x01)) ? BOOL_TRUE : BOOL_FALSE)
163 typedef struct tagBISO_VOLUME_DESC
174 typedef struct tagBISO_PRIMARY_VOLUME_DESC
180 /* ucVersion: version [ISODCL ( 7, 7)] */
183 /* ucResv1: unused1 [ISODCL ( 8, 8)] */
187 * szSystemId[32]: system_id [ISODCL ( 9, 40)]
191 /* szVolumeId[32]: volume_id [ISODCL ( 41, 72)] */
194 /* aucResv2[8]: unused2 [ISODCL ( 73, 80)] */
197 BISO_DEF_733(uiVolumeSpace
)
199 /* aucResv3[32]: unused3 [ISODCL ( 89, 120)] */
202 BISO_DEF_723(usVolumeSet
)
205 * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
207 BISO_DEF_723(usVolumeSeq
)
210 * usBlockSize: logical_block_size [ISODCL (129, 132)]
212 BISO_DEF_723(usBlockSize
)
215 * uiPathTblSize: path_table_size [ISODCL (133, 140)]
217 BISO_DEF_733(uiPathTblSize
)
219 UINT32 uiTypeLPathTblLoc
;
221 UINT32 uiOptTypeLPathTblLoc
;
223 UINT32 uiTypeMPathTblLoc
;
225 UINT32 uiOptTypeMPathTblLoc
;
227 BISO_DIR_RECORD_S stRootDirRecord
;
229 /* szVolumeSetId: volume_set_id [ISODCL (191, 318)] */
230 CHAR szVolumeSetId
[128];
232 /* szPublisherId: publisher_id [ISODCL (319, 446)] */
233 CHAR szPublisherId
[128];
235 /* szPreparerId: preparer_id [ISODCL (447, 574)] */
236 CHAR szPreparerId
[128];
238 /* szApplicationId: application_id [ISODCL (575, 702)] */
239 CHAR szApplicationId
[128];
241 /* szCopyrightFileId: copyright_file_id [ISODCL (703, 739)] [1] */
242 CHAR szCopyrightFileId
[37];
244 /* szAbstractFileId: abstract_file_id [ISODCL (740, 776)] */
245 CHAR szAbstractFileId
[37];
247 /* szBibliographicFileId: bibliographic_file_id [ISODCL (777, 813)] */
248 CHAR szBibliographicFileId
[37];
250 /* szCreationDate: creation_date [ISODCL (814, 830)] */
251 CHAR szCreationDate
[17];
253 /* szModifyDate: modification_date [ISODCL (831, 847)] */
254 CHAR szModifyDate
[17];
256 /* szExpirationDate: expiration_date [ISODCL (848, 864)] */
257 CHAR szExpirationDate
[17];
259 /* szEffectiveDate: effective_date [ISODCL (865, 881)] */
260 CHAR szEffectiveDate
[17];
262 /* ucFileStructVer: file_structure_version [ISODCL (882, 882)] */
263 UCHAR ucFileStructVer
;
265 /* ucResv4: unused4 [ISODCL (883, 883)] */
268 /* aucApplicationData: application_data [ISODCL (884, 1395)] */
269 UCHAR aucApplicationData
[512];
271 /* ucResv5: unused5 [ISODCL (1396, 2048)] */
275 typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
280 * szId[5]: id [ISODCL ( 2, 6)]
284 /* ucVersion: version [ISODCL ( 7, 7)] */
288 * ucFlags: flags [ISODCL ( 8, 8)]
293 * szSystemId[32]: system_id [ISODCL ( 9, 40)]
297 /* szVolumeId[32]: volume_id [ISODCL ( 41, 72)] 名称, 注意[1] */
300 /* aucResv2[8]: unused2 [ISODCL ( 73, 80)] */
304 * uiVolumeSpace: volume_space_size [ISODCL ( 81, 88)]
306 BISO_DEF_733(uiVolumeSpace
)
308 /* aucEscape[32]: escape [ISODCL ( 89, 120)] */
312 * usVolumeSet: volume_set_size [ISODCL (121, 124)]
314 BISO_DEF_723(usVolumeSet
)
317 * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
319 BISO_DEF_723(usVolumeSeq
)
322 * usBlockSize: logical_block_size [ISODCL (129, 132)]
324 BISO_DEF_723(usBlockSize
)
326 BISO_DEF_733(uiPathTblSize
)
328 UINT32 uiTypeLPathTblLoc
;
330 UINT32 uiOptTypeLPathTblLoc
;
332 UINT32 uiTypeMPathTblLoc
;
334 UINT32 uiOptTypeMPathTblLoc
;
336 BISO_DIR_RECORD_S stRootDirRecord
;
338 /* szVolumeSetId: volume_set_id [ISODCL (191, 318)] */
339 CHAR szVolumeSetId
[128];
341 /* szPublisherId: publisher_id [ISODCL (319, 446)] */
342 CHAR szPublisherId
[128];
344 /* szPreparerId: preparer_id [ISODCL (447, 574)] */
345 CHAR szPreparerId
[128];
347 /* szApplicationId: application_id [ISODCL (575, 702)] */
348 CHAR szApplicationId
[128];
350 /* szCopyrightFileId: copyright_file_id [ISODCL (703, 739)] */
351 CHAR szCopyrightFileId
[37];
353 /* szAbstractFileId: abstract_file_id [ISODCL (740, 776)]*/
354 CHAR szAbstractFileId
[37];
356 /* szBibliographicFileId: bibliographic_file_id [ISODCL (777, 813)] */
357 CHAR szBibliographicFileId
[37];
359 /* szCreationDate: creation_date [ISODCL (814, 830)]*/
360 CHAR szCreationDate
[17];
362 /* szModifyDate: modification_date [ISODCL (831, 847)] */
363 CHAR szModifyDate
[17];
365 /* szExpirationDate: expiration_date [ISODCL (848, 864)] */
366 CHAR szExpirationDate
[17];
368 /* szEffectiveDate: effective_date [ISODCL (865, 881)] */
369 CHAR szEffectiveDate
[17];
371 /* ucFileStructVer: file_structure_version [ISODCL (882, 882)] */
372 UCHAR ucFileStructVer
;
374 /* ucResv4: unused4 [ISODCL (883, 883)] */
377 /* aucApplicationData: application_data [ISODCL (884, 1395)] */
378 UCHAR aucApplicationData
[512];
380 /* ucResv5: unused5 [ISODCL (1396, 2048)] */
384 typedef struct tagBISO_BOOT_DESC
388 * szId[5]: id [ISODCL ( 2, 6)]
392 /* ucVersion: version [ISODCL ( 7, 7)] */
395 CHAR szBootSystemId
[32];
399 UINT32 uiBootCatlogStart
;
401 UCHAR aucBootData
[1972];
404 typedef struct tagBISO_EXTATTR_RECORD
406 BISO_DEF_723(usOwnerId
)
407 BISO_DEF_723(usGroupId
)
411 CHAR szFileCreateDate
[17];
412 CHAR szFileModifyDate
[17];
413 CHAR szFileExpirationDate
[17];
414 CHAR szFileEffectiveDate
[17];
416 UCHAR ucRecordFormat
;
420 BISO_DEF_723(usRecordLen
)
424 UCHAR aucSystemData
[64];
426 UCHAR ucRecordVersion
;
432 BISO_DEF_723(usAppDataLen
)
434 /* UCHAR aucAppData[xxx]; */
435 /* UCHAR aucEscape[xxx]; */
436 }BISO_EXTATTR_RECORD_S
;
440 typedef struct tagBISO_VD_NODE
442 BISO_DLL_NODE_S stNode
;
446 typedef struct tagBISO_POSIX_INFO
449 UINT uiPosixFileMode
;
450 UINT uiPosixFileLink
;
451 UINT uiPosixFileUserId
;
452 UINT uiPosixFileGroupId
;
455 BISO_DATE_S stCreateTime
;
456 BISO_DATE_S stModifyTime
;
457 BISO_DATE_S stLastAccessTime
;
458 BISO_DATE_S stLastAttrChangeTime
;
459 BISO_DATE_S stLastBackupTime
;
460 BISO_DATE_S stExpirationTime
;
461 BISO_DATE_S stEffectiveTime
;
467 typedef struct tagBISO_SVD_DIR_TREE
469 struct tagBISO_SVD_DIR_TREE
*pstParent
;
470 struct tagBISO_SVD_DIR_TREE
*pstNext
;
471 struct tagBISO_SVD_DIR_TREE
*pstChild
;
476 UINT64 ui64FileRecordOffset
;
477 struct tagBISO_SVD_DIR_TREE
*pstFileList
;
478 }BISO_SVD_DIR_TREE_S
;
480 typedef struct tagBISO_DIR_TREE
482 struct tagBISO_DIR_TREE
*pstParent
;
483 struct tagBISO_DIR_TREE
*pstNext
;
484 struct tagBISO_DIR_TREE
*pstChild
;
492 UINT64 ui64FileRecordOffset
;
494 BISO_DIR_STAT_S
*pstDirStat
;
496 BISO_POSIX_INFO_S
*pstPosixInfo
;
498 struct tagBISO_DIR_TREE
*pstFileList
;
501 #define BISO_DIR_TREE_IS_SYMLINK(pstDirTree) \
502 (((NULL != pstDirTree->pstPosixInfo) && \
503 (NULL != pstDirTree->pstPosixInfo->pcLinkSrc)) ? BOOL_TRUE : BOOL_FALSE)
505 typedef struct tagBISO_PARSER
507 CHAR szFileName
[1024];
517 UCHAR
*pucElToritoEntry
;
522 BISO_DIR_TREE_S stDirTree
;
524 BISO_SVD_DIR_TREE_S stSVDDirTree
;
527 ULONG BISO_9660_OpenImage
529 IN BOOL_T bParseSVDDirTree
,
530 IN CONST CHAR
*pcFileName
,
531 OUT BISO_PARSER_S
*pstParser
533 BISO_PARSER_S
* BISO_9660_CreateParser(VOID
);
534 VOID
BISO_9660_DestroyParser(INOUT BISO_PARSER_S
*pstParser
);
535 ULONG BISO_9660_ParseDate84261
537 IN CONST CHAR
*pcDate
,
538 OUT BISO_DATE_S
*pstDate
540 VOID
BISO_9660_FmtDate84261(IN
time_t ulTime
, IN UINT uiBufSize
, OUT CHAR
*pcDate
);
541 VOID BISO_9660_FillDfsStack
543 IN BISO_DIR_TREE_S
*pstTop
,
544 INOUT BISO_QUEUE_S
*pstQueue
546 ULONG BISO_9660_ExtractFile
548 IN BISO_FILE_S
*pstFile
,
549 IN CONST CHAR
*pcDstFullPath
,
550 IN CONST BISO_DIR_TREE_S
*pstFileNode
,
551 IN CONST BISO_EXTRACT_CTRL_S
*pstCtrl
555 #define BISO_EXTRACE_CAT_PATH(szFullPath, uiCurPos, szName, NameLen) \
557 memcpy(szFullPath + uiCurPos, szName, NameLen); \
558 uiCurPos += NameLen; \
559 szFullPath[uiCurPos++] = '/'; \
560 szFullPath[uiCurPos] = 0; \
564 #define BISO_9660_CHECK_RET(ulRet, pstFile) \
565 if (BISO_SUCCESS != ulRet) \
567 BISO_PLAT_CloseFile(pstFile); \
571 BISO_DIR_TREE_S
* BISO_UTIL_FindLinkTgt(IN BISO_DIR_TREE_S
*pstCurNode
);
573 #endif /* __BISO_9660_H__ */