]> glassweightruler.freedombox.rocks Git - Ventoy.git/blob - VtoyTool/BabyISO/biso_9660.h
Update German translation (#2612)
[Ventoy.git] / VtoyTool / BabyISO / biso_9660.h
1 /******************************************************************************
2 * bios_9660.h
3 *
4 * Copyright (c) 2020, longpanda <admin@ventoy.net>
5 *
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.
10 *
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.
15 *
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/>.
18 *
19 */
20
21 #ifndef __BISO_9660_H__
22 #define __BISO_9660_H__
23
24 #define BISO_SECTOR_SIZE 2048
25
26 #define BISO_BLOCK_SIZE 2048
27
28 #define BISO_SYSTEM_AREA_SIZE (16 * BISO_SECTOR_SIZE)
29
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
36
37 #define BISO_VD_ID "CD001"
38
39 #define BISO_USED_SECTOR_NUM(uiFileSize) \
40 (uiFileSize / BISO_SECTOR_SIZE) + ((uiFileSize % BISO_SECTOR_SIZE > 0) ? 1 : 0)
41
42 #define BISO_9660_IS_CURRENT(pstDirRecord) \
43 (((1 == pstDirRecord->ucNameLen) && (0x0 == pstDirRecord->szName[0])) ? BOOL_TRUE : BOOL_FALSE)
44
45 #define BISO_9660_IS_PARENT(pstDirRecord) \
46 (((1 == pstDirRecord->ucNameLen) && (0x1 == pstDirRecord->szName[0])) ? BOOL_TRUE : BOOL_FALSE)
47
48 #define BISO_9600_FREE_STAT(pstDir) \
49 { \
50 if (NULL != pstDir->pstDirStat) \
51 { \
52 BISO_FREE(pstDir->pstDirStat); \
53 }\
54 }
55
56 #define BISO_9600_FREE_POSIX(pstDir) \
57 { \
58 if (NULL != pstDir->pstPosixInfo) \
59 { \
60 if (NULL != pstDir->pstPosixInfo->pcLinkSrc) \
61 { \
62 BISO_FREE(pstDir->pstPosixInfo->pcLinkSrc); \
63 } \
64 BISO_FREE(pstDir->pstPosixInfo); \
65 } \
66 }
67
68 #define BISO_9600_FREE_DIRTREE(pstDir) \
69 { \
70 BISO_9600_FREE_STAT(pstDir); \
71 BISO_9600_FREE_POSIX(pstDir); \
72 BISO_FREE(pstDir); \
73 }
74
75 #if (__BYTE_ORDER == __LITTLE_ENDIAN)
76
77 #define BISO_DEF_723(usData) \
78 UINT16 usData;\
79 UINT16 usData##Swap;
80
81 #define BISO_DEF_733(uiData) \
82 UINT32 uiData;\
83 UINT32 uiData##Swap;
84
85 #define BISO_PATHTBL_LOCATION(pstPVD) (pstPVD->uiTypeLPathTblLoc)
86
87 #elif (__BYTE_ORDER == __BIG_ENDIAN)
88
89 #define BISO_DEF_723(usData) \
90 UINT16 usData##Swap;\
91 UINT16 usData;
92
93 #define BISO_DEF_733(uiData) \
94 UINT32 uiData##Swap;\
95 UINT32 uiData;
96
97 #define BISO_PATHTBL_LOCATION(pstPVD) (pstPVD->uiTypeMPathTblLoc)
98
99 #else
100 #error ("you must first define __BYTE_ORDER !!!")
101 #endif
102
103 #pragma pack(1)
104
105 typedef struct tagBISO_DATE_915
106 {
107 UCHAR ucYear; /* 1900+ */
108 UCHAR ucMonth;
109 UCHAR ucDay;
110 UCHAR ucHour;
111 UCHAR ucMin;
112 UCHAR ucSec;
113 CHAR cTimeZone;
114 }BISO_DATE_915_S;
115
116 typedef struct tagBISO_PATH_TABLE
117 {
118 UCHAR ucDirNameLen;
119
120 UCHAR ucExtAttrRecordLen;
121
122 UINT32 uiExtent;
123
124 UINT16 usParentDirNum;
125
126 CHAR szDirName[1];
127
128 /* UCHAR ucPadding; */
129 }BISO_PATH_TABLE_S;
130
131 #define BISO_9660_PATH_LEN(pstPath) (pstPath->ucDirNameLen + 8 + (pstPath->ucDirNameLen & 0x01))
132
133 typedef struct tagBISO_DIR_RECORD
134 {
135 UCHAR ucLength;
136
137 UCHAR ucExtAttrLen;
138
139 BISO_DEF_733(uiExtent)
140
141 BISO_DEF_733(uiSize)
142
143 BISO_DATE_915_S stDate;
144
145 UCHAR ucFlags;
146
147 UCHAR ucFileUnitSize;
148
149 UCHAR ucInterLeave;
150
151 BISO_DEF_723(uiVolumeSeqNum)
152
153 UCHAR ucNameLen;
154
155 CHAR szName[1];
156
157 /* UCHAR aucSystemUse[xxxx] */
158 }BISO_DIR_RECORD_S;
159
160 #define BISO_DIR_RECORD_IS_PATH(pstDirRecord) \
161 ((1 == ((pstDirRecord->ucFlags >> 1) & 0x01)) ? BOOL_TRUE : BOOL_FALSE)
162
163 typedef struct tagBISO_VOLUME_DESC
164 {
165 UCHAR ucType;
166
167 CHAR szId[5];
168
169 UCHAR ucVersion;
170
171 UCHAR ucData[2041];
172 }BISO_VD_S;
173
174 typedef struct tagBISO_PRIMARY_VOLUME_DESC
175 {
176 UCHAR ucType;
177
178 CHAR szId[5];
179
180 /* ucVersion: version [ISODCL ( 7, 7)] */
181 UCHAR ucVersion;
182
183 /* ucResv1: unused1 [ISODCL ( 8, 8)] */
184 UCHAR ucResv1;
185
186 /*
187 * szSystemId[32]: system_id [ISODCL ( 9, 40)]
188 */
189 CHAR szSystemId[32];
190
191 /* szVolumeId[32]: volume_id [ISODCL ( 41, 72)] */
192 CHAR szVolumeId[32];
193
194 /* aucResv2[8]: unused2 [ISODCL ( 73, 80)] */
195 UCHAR aucResv2[8];
196
197 BISO_DEF_733(uiVolumeSpace)
198
199 /* aucResv3[32]: unused3 [ISODCL ( 89, 120)] */
200 UCHAR aucResv3[32];
201
202 BISO_DEF_723(usVolumeSet)
203
204 /*
205 * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
206 */
207 BISO_DEF_723(usVolumeSeq)
208
209 /*
210 * usBlockSize: logical_block_size [ISODCL (129, 132)]
211 */
212 BISO_DEF_723(usBlockSize)
213
214 /*
215 * uiPathTblSize: path_table_size [ISODCL (133, 140)]
216 */
217 BISO_DEF_733(uiPathTblSize)
218
219 UINT32 uiTypeLPathTblLoc;
220
221 UINT32 uiOptTypeLPathTblLoc;
222
223 UINT32 uiTypeMPathTblLoc;
224
225 UINT32 uiOptTypeMPathTblLoc;
226
227 BISO_DIR_RECORD_S stRootDirRecord;
228
229 /* szVolumeSetId: volume_set_id [ISODCL (191, 318)] */
230 CHAR szVolumeSetId[128];
231
232 /* szPublisherId: publisher_id [ISODCL (319, 446)] */
233 CHAR szPublisherId[128];
234
235 /* szPreparerId: preparer_id [ISODCL (447, 574)] */
236 CHAR szPreparerId[128];
237
238 /* szApplicationId: application_id [ISODCL (575, 702)] */
239 CHAR szApplicationId[128];
240
241 /* szCopyrightFileId: copyright_file_id [ISODCL (703, 739)] [1] */
242 CHAR szCopyrightFileId[37];
243
244 /* szAbstractFileId: abstract_file_id [ISODCL (740, 776)] */
245 CHAR szAbstractFileId[37];
246
247 /* szBibliographicFileId: bibliographic_file_id [ISODCL (777, 813)] */
248 CHAR szBibliographicFileId[37];
249
250 /* szCreationDate: creation_date [ISODCL (814, 830)] */
251 CHAR szCreationDate[17];
252
253 /* szModifyDate: modification_date [ISODCL (831, 847)] */
254 CHAR szModifyDate[17];
255
256 /* szExpirationDate: expiration_date [ISODCL (848, 864)] */
257 CHAR szExpirationDate[17];
258
259 /* szEffectiveDate: effective_date [ISODCL (865, 881)] */
260 CHAR szEffectiveDate[17];
261
262 /* ucFileStructVer: file_structure_version [ISODCL (882, 882)] */
263 UCHAR ucFileStructVer;
264
265 /* ucResv4: unused4 [ISODCL (883, 883)] */
266 UCHAR ucResv4;
267
268 /* aucApplicationData: application_data [ISODCL (884, 1395)] */
269 UCHAR aucApplicationData[512];
270
271 /* ucResv5: unused5 [ISODCL (1396, 2048)] */
272 UCHAR aucResv5[653];
273 }BISO_PVD_S;
274
275 typedef struct tagBISO_SUPPLEMENTARY_VOLUME_DESC
276 {
277 UCHAR ucType;
278
279 /*
280 * szId[5]: id [ISODCL ( 2, 6)]
281 */
282 CHAR szId[5];
283
284 /* ucVersion: version [ISODCL ( 7, 7)] */
285 UCHAR ucVersion;
286
287 /*
288 * ucFlags: flags [ISODCL ( 8, 8)]
289 */
290 UCHAR ucFlags;
291
292 /*
293 * szSystemId[32]: system_id [ISODCL ( 9, 40)]
294 */
295 CHAR szSystemId[32];
296
297 /* szVolumeId[32]: volume_id [ISODCL ( 41, 72)] 名称, 注意[1] */
298 CHAR szVolumeId[32];
299
300 /* aucResv2[8]: unused2 [ISODCL ( 73, 80)] */
301 UCHAR aucResv2[8];
302
303 /*
304 * uiVolumeSpace: volume_space_size [ISODCL ( 81, 88)]
305 */
306 BISO_DEF_733(uiVolumeSpace)
307
308 /* aucEscape[32]: escape [ISODCL ( 89, 120)] */
309 UCHAR aucEscape[32];
310
311 /*
312 * usVolumeSet: volume_set_size [ISODCL (121, 124)]
313 */
314 BISO_DEF_723(usVolumeSet)
315
316 /*
317 * usVolumeSeq: volume_sequence_number [ISODCL (125, 128)]
318 */
319 BISO_DEF_723(usVolumeSeq)
320
321 /*
322 * usBlockSize: logical_block_size [ISODCL (129, 132)]
323 */
324 BISO_DEF_723(usBlockSize)
325
326 BISO_DEF_733(uiPathTblSize)
327
328 UINT32 uiTypeLPathTblLoc;
329
330 UINT32 uiOptTypeLPathTblLoc;
331
332 UINT32 uiTypeMPathTblLoc;
333
334 UINT32 uiOptTypeMPathTblLoc;
335
336 BISO_DIR_RECORD_S stRootDirRecord;
337
338 /* szVolumeSetId: volume_set_id [ISODCL (191, 318)] */
339 CHAR szVolumeSetId[128];
340
341 /* szPublisherId: publisher_id [ISODCL (319, 446)] */
342 CHAR szPublisherId[128];
343
344 /* szPreparerId: preparer_id [ISODCL (447, 574)] */
345 CHAR szPreparerId[128];
346
347 /* szApplicationId: application_id [ISODCL (575, 702)] */
348 CHAR szApplicationId[128];
349
350 /* szCopyrightFileId: copyright_file_id [ISODCL (703, 739)] */
351 CHAR szCopyrightFileId[37];
352
353 /* szAbstractFileId: abstract_file_id [ISODCL (740, 776)]*/
354 CHAR szAbstractFileId[37];
355
356 /* szBibliographicFileId: bibliographic_file_id [ISODCL (777, 813)] */
357 CHAR szBibliographicFileId[37];
358
359 /* szCreationDate: creation_date [ISODCL (814, 830)]*/
360 CHAR szCreationDate[17];
361
362 /* szModifyDate: modification_date [ISODCL (831, 847)] */
363 CHAR szModifyDate[17];
364
365 /* szExpirationDate: expiration_date [ISODCL (848, 864)] */
366 CHAR szExpirationDate[17];
367
368 /* szEffectiveDate: effective_date [ISODCL (865, 881)] */
369 CHAR szEffectiveDate[17];
370
371 /* ucFileStructVer: file_structure_version [ISODCL (882, 882)] */
372 UCHAR ucFileStructVer;
373
374 /* ucResv4: unused4 [ISODCL (883, 883)] */
375 UCHAR ucResv4;
376
377 /* aucApplicationData: application_data [ISODCL (884, 1395)] */
378 UCHAR aucApplicationData[512];
379
380 /* ucResv5: unused5 [ISODCL (1396, 2048)] */
381 UCHAR aucResv5[653];
382 }BISO_SVD_S;
383
384 typedef struct tagBISO_BOOT_DESC
385 {
386 UCHAR ucType;
387 /*
388 * szId[5]: id [ISODCL ( 2, 6)]
389 */
390 CHAR szId[5];
391
392 /* ucVersion: version [ISODCL ( 7, 7)] */
393 UCHAR ucVersion;
394
395 CHAR szBootSystemId[32];
396
397 UCHAR aucResv[32];
398
399 UINT32 uiBootCatlogStart;
400
401 UCHAR aucBootData[1972];
402 }BISO_BVD_S;
403
404 typedef struct tagBISO_EXTATTR_RECORD
405 {
406 BISO_DEF_723(usOwnerId)
407 BISO_DEF_723(usGroupId)
408
409 USHORT usPermission;
410
411 CHAR szFileCreateDate[17];
412 CHAR szFileModifyDate[17];
413 CHAR szFileExpirationDate[17];
414 CHAR szFileEffectiveDate[17];
415
416 UCHAR ucRecordFormat;
417
418 UCHAR ucRecordAttr;
419
420 BISO_DEF_723(usRecordLen)
421
422 CHAR szSystemId[32];
423
424 UCHAR aucSystemData[64];
425
426 UCHAR ucRecordVersion;
427
428 UCHAR ucEscapeLen;
429
430 UCHAR aucResv[64];
431
432 BISO_DEF_723(usAppDataLen)
433
434 /* UCHAR aucAppData[xxx]; */
435 /* UCHAR aucEscape[xxx]; */
436 }BISO_EXTATTR_RECORD_S;
437
438 #pragma pack()
439
440 typedef struct tagBISO_VD_NODE
441 {
442 BISO_DLL_NODE_S stNode;
443 BISO_VD_S stVD;
444 }BISO_VD_NODE_S;
445
446 typedef struct tagBISO_POSIX_INFO
447 {
448 BOOL_T bHasNMEntry;
449 UINT uiPosixFileMode;
450 UINT uiPosixFileLink;
451 UINT uiPosixFileUserId;
452 UINT uiPosixFileGroupId;
453 UINT uiPosixFileSNO;
454 UINT64 ui64DevNum;
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;
462
463 UINT uiLinkLen;
464 CHAR *pcLinkSrc;
465 }BISO_POSIX_INFO_S;
466
467 typedef struct tagBISO_SVD_DIR_TREE
468 {
469 struct tagBISO_SVD_DIR_TREE *pstParent;
470 struct tagBISO_SVD_DIR_TREE *pstNext;
471 struct tagBISO_SVD_DIR_TREE *pstChild;
472
473 UINT uiExtent;
474 UINT uiSize;
475
476 UINT64 ui64FileRecordOffset;
477 struct tagBISO_SVD_DIR_TREE *pstFileList;
478 }BISO_SVD_DIR_TREE_S;
479
480 typedef struct tagBISO_DIR_TREE
481 {
482 struct tagBISO_DIR_TREE *pstParent;
483 struct tagBISO_DIR_TREE *pstNext;
484 struct tagBISO_DIR_TREE *pstChild;
485
486 USHORT usNameLen;
487 CHAR szName[300];
488 UINT uiPathTblId;
489 UINT uiExtent;
490 UINT uiSize;
491
492 UINT64 ui64FileRecordOffset;
493
494 BISO_DIR_STAT_S *pstDirStat;
495
496 BISO_POSIX_INFO_S *pstPosixInfo;
497
498 struct tagBISO_DIR_TREE *pstFileList;
499 }BISO_DIR_TREE_S;
500
501 #define BISO_DIR_TREE_IS_SYMLINK(pstDirTree) \
502 (((NULL != pstDirTree->pstPosixInfo) && \
503 (NULL != pstDirTree->pstPosixInfo->pcLinkSrc)) ? BOOL_TRUE : BOOL_FALSE)
504
505 typedef struct tagBISO_PARSER
506 {
507 CHAR szFileName[1024];
508
509 BISO_PVD_S *pstPVD;
510 BISO_SVD_S *pstSVD;
511 BISO_BVD_S *pstBVD;
512 BISO_DLL_S stVDList;
513
514 UCHAR *pucPathTable;
515
516 UINT uiElToritoLen;
517 UCHAR *pucElToritoEntry;
518
519 UCHAR ucRRIPVersion;
520 UCHAR ucRRIPSkipLen;
521
522 BISO_DIR_TREE_S stDirTree;
523
524 BISO_SVD_DIR_TREE_S stSVDDirTree;
525 }BISO_PARSER_S;
526
527 ULONG BISO_9660_OpenImage
528 (
529 IN BOOL_T bParseSVDDirTree,
530 IN CONST CHAR *pcFileName,
531 OUT BISO_PARSER_S *pstParser
532 );
533 BISO_PARSER_S * BISO_9660_CreateParser(VOID);
534 VOID BISO_9660_DestroyParser(INOUT BISO_PARSER_S *pstParser);
535 ULONG BISO_9660_ParseDate84261
536 (
537 IN CONST CHAR *pcDate,
538 OUT BISO_DATE_S *pstDate
539 );
540 VOID BISO_9660_FmtDate84261(IN time_t ulTime, IN UINT uiBufSize, OUT CHAR *pcDate);
541 VOID BISO_9660_FillDfsStack
542 (
543 IN BISO_DIR_TREE_S *pstTop,
544 INOUT BISO_QUEUE_S *pstQueue
545 );
546 ULONG BISO_9660_ExtractFile
547 (
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
552 );
553
554 /* 拼接路径 */
555 #define BISO_EXTRACE_CAT_PATH(szFullPath, uiCurPos, szName, NameLen) \
556 {\
557 memcpy(szFullPath + uiCurPos, szName, NameLen); \
558 uiCurPos += NameLen; \
559 szFullPath[uiCurPos++] = '/'; \
560 szFullPath[uiCurPos] = 0; \
561 }
562
563 /* 检查结果返回 */
564 #define BISO_9660_CHECK_RET(ulRet, pstFile) \
565 if (BISO_SUCCESS != ulRet) \
566 { \
567 BISO_PLAT_CloseFile(pstFile); \
568 return ulRet; \
569 }
570
571 BISO_DIR_TREE_S * BISO_UTIL_FindLinkTgt(IN BISO_DIR_TREE_S *pstCurNode);
572
573 #endif /* __BISO_9660_H__ */
574