1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#ifndef __HFS_FORMAT__
23#define __HFS_FORMAT__
24
25#include <sys/types.h>
26#include <sys/appleapiopts.h>
27
28
29
30
31
32
33
34
35
36
37
38#ifdef __cplusplus
39extern "C" {
40#endif
41
42
43#pragma options align=mac68k
44
45
46enum {
47 kHFSSigWord = 0x4244,
48 kHFSPlusSigWord = 0x482B,
49 kHFSXSigWord = 0x4858,
50
51 kHFSPlusVersion = 0x0004,
52 kHFSXVersion = 0x0005,
53
54 kHFSPlusMountVersion = 0x31302E30,
55 kHFSJMountVersion = 0x4846534a,
56 kFSKMountVersion = 0x46534b21
57};
58
59
60#ifdef __APPLE_API_PRIVATE
61
62
63
64
65
66
67
68
69#define HFSPLUSMETADATAFOLDER "\xC0\x80\xC0\x80\xC0\x80\xC0\x80HFS+ Private Data"
70
71
72
73
74
75
76
77
78
79#define HFS_INODE_PREFIX "iNode"
80#define HFS_DELETE_PREFIX "temp"
81
82#endif
83
84
85
86
87enum {
88 kHardLinkFileType = 0x686C6E6B,
89 kHFSPlusCreator = 0x6866732B
90};
91
92
93#ifndef _HFSUNISTR255_DEFINED_
94#define _HFSUNISTR255_DEFINED_
95
96struct HFSUniStr255 {
97 u_int16_t length;
98 u_int16_t unicode[255];
99};
100typedef struct HFSUniStr255 HFSUniStr255;
101typedef const HFSUniStr255 *ConstHFSUniStr255Param;
102#endif
103
104enum {
105 kHFSMaxVolumeNameChars = 27,
106 kHFSMaxFileNameChars = 31,
107 kHFSPlusMaxFileNameChars = 255
108};
109
110
111
112
113
114struct HFSExtentKey {
115 u_int8_t keyLength;
116 u_int8_t forkType;
117 u_int32_t fileID;
118 u_int16_t startBlock;
119};
120typedef struct HFSExtentKey HFSExtentKey;
121
122
123struct HFSPlusExtentKey {
124 u_int16_t keyLength;
125 u_int8_t forkType;
126 u_int8_t pad;
127 u_int32_t fileID;
128 u_int32_t startBlock;
129};
130typedef struct HFSPlusExtentKey HFSPlusExtentKey;
131
132
133enum {
134 kHFSExtentDensity = 3,
135 kHFSPlusExtentDensity = 8
136};
137
138
139struct HFSExtentDescriptor {
140 u_int16_t startBlock;
141 u_int16_t blockCount;
142};
143typedef struct HFSExtentDescriptor HFSExtentDescriptor;
144
145
146struct HFSPlusExtentDescriptor {
147 u_int32_t startBlock;
148 u_int32_t blockCount;
149};
150typedef struct HFSPlusExtentDescriptor HFSPlusExtentDescriptor;
151
152
153typedef HFSExtentDescriptor HFSExtentRecord[3];
154
155
156typedef HFSPlusExtentDescriptor HFSPlusExtentRecord[8];
157
158
159
160struct FndrFileInfo {
161 u_int32_t fdType;
162 u_int32_t fdCreator;
163 u_int16_t fdFlags;
164 struct {
165 int16_t v;
166 int16_t h;
167 } fdLocation;
168 int16_t opaque;
169};
170typedef struct FndrFileInfo FndrFileInfo;
171
172struct FndrDirInfo {
173 struct {
174 int16_t top;
175 int16_t left;
176 int16_t bottom;
177 int16_t right;
178 } frRect;
179 unsigned short frFlags;
180 struct {
181 u_int16_t v;
182 u_int16_t h;
183 } frLocation;
184 int16_t opaque;
185};
186typedef struct FndrDirInfo FndrDirInfo;
187
188struct FndrOpaqueInfo {
189 int8_t opaque[16];
190};
191typedef struct FndrOpaqueInfo FndrOpaqueInfo;
192
193
194
195struct HFSPlusForkData {
196 u_int64_t logicalSize;
197 u_int32_t clumpSize;
198 u_int32_t totalBlocks;
199 HFSPlusExtentRecord extents;
200};
201typedef struct HFSPlusForkData HFSPlusForkData;
202
203
204
205
206
207
208
209struct HFSPlusBSDInfo {
210 u_int32_t ownerID;
211 u_int32_t groupID;
212 u_int8_t adminFlags;
213 u_int8_t ownerFlags;
214 u_int16_t fileMode;
215 union {
216 u_int32_t iNodeNum;
217 u_int32_t linkCount;
218 u_int32_t rawDevice;
219 } special;
220};
221typedef struct HFSPlusBSDInfo HFSPlusBSDInfo;
222
223
224
225
226enum {
227 kHFSRootParentID = 1,
228 kHFSRootFolderID = 2,
229 kHFSExtentsFileID = 3,
230 kHFSCatalogFileID = 4,
231 kHFSBadBlockFileID = 5,
232 kHFSAllocationFileID = 6,
233 kHFSStartupFileID = 7,
234 kHFSAttributesFileID = 8,
235 kHFSRepairCatalogFileID = 14,
236 kHFSBogusExtentFileID = 15,
237 kHFSFirstUserCatalogNodeID = 16
238};
239
240
241struct HFSCatalogKey {
242 u_int8_t keyLength;
243 u_int8_t reserved;
244 u_int32_t parentID;
245 u_int8_t nodeName[kHFSMaxFileNameChars + 1];
246};
247typedef struct HFSCatalogKey HFSCatalogKey;
248
249
250struct HFSPlusCatalogKey {
251 u_int16_t keyLength;
252 u_int32_t parentID;
253 HFSUniStr255 nodeName;
254};
255typedef struct HFSPlusCatalogKey HFSPlusCatalogKey;
256
257
258enum {
259
260 kHFSFolderRecord = 0x0100,
261 kHFSFileRecord = 0x0200,
262 kHFSFolderThreadRecord = 0x0300,
263 kHFSFileThreadRecord = 0x0400,
264
265
266 kHFSPlusFolderRecord = 1,
267 kHFSPlusFileRecord = 2,
268 kHFSPlusFolderThreadRecord = 3,
269 kHFSPlusFileThreadRecord = 4
270};
271
272
273
274enum {
275 kHFSFileLockedBit = 0x0000,
276 kHFSFileLockedMask = 0x0001,
277
278 kHFSThreadExistsBit = 0x0001,
279 kHFSThreadExistsMask = 0x0002,
280
281 kHFSHasAttributesBit = 0x0002,
282 kHFSHasAttributesMask = 0x0004,
283
284 kHFSHasSecurityBit = 0x0003,
285 kHFSHasSecurityMask = 0x0008
286};
287
288
289
290struct HFSCatalogFolder {
291 int16_t recordType;
292 u_int16_t flags;
293 u_int16_t valence;
294 u_int32_t folderID;
295 u_int32_t createDate;
296 u_int32_t modifyDate;
297 u_int32_t backupDate;
298 FndrDirInfo userInfo;
299 FndrOpaqueInfo finderInfo;
300 u_int32_t reserved[4];
301};
302typedef struct HFSCatalogFolder HFSCatalogFolder;
303
304
305struct HFSPlusCatalogFolder {
306 int16_t recordType;
307 u_int16_t flags;
308 u_int32_t valence;
309 u_int32_t folderID;
310 u_int32_t createDate;
311 u_int32_t contentModDate;
312 u_int32_t attributeModDate;
313 u_int32_t accessDate;
314 u_int32_t backupDate;
315 HFSPlusBSDInfo bsdInfo;
316 FndrDirInfo userInfo;
317 FndrOpaqueInfo finderInfo;
318 u_int32_t textEncoding;
319 u_int32_t attrBlocks;
320};
321typedef struct HFSPlusCatalogFolder HFSPlusCatalogFolder;
322
323
324struct HFSCatalogFile {
325 int16_t recordType;
326 u_int8_t flags;
327 int8_t fileType;
328 FndrFileInfo userInfo;
329 u_int32_t fileID;
330 u_int16_t dataStartBlock;
331 int32_t dataLogicalSize;
332 int32_t dataPhysicalSize;
333 u_int16_t rsrcStartBlock;
334 int32_t rsrcLogicalSize;
335 int32_t rsrcPhysicalSize;
336 u_int32_t createDate;
337 u_int32_t modifyDate;
338 u_int32_t backupDate;
339 FndrOpaqueInfo finderInfo;
340 u_int16_t clumpSize;
341 HFSExtentRecord dataExtents;
342 HFSExtentRecord rsrcExtents;
343 u_int32_t reserved;
344};
345typedef struct HFSCatalogFile HFSCatalogFile;
346
347
348struct HFSPlusCatalogFile {
349 int16_t recordType;
350 u_int16_t flags;
351 u_int32_t reserved1;
352 u_int32_t fileID;
353 u_int32_t createDate;
354 u_int32_t contentModDate;
355 u_int32_t attributeModDate;
356 u_int32_t accessDate;
357 u_int32_t backupDate;
358 HFSPlusBSDInfo bsdInfo;
359 FndrFileInfo userInfo;
360 FndrOpaqueInfo finderInfo;
361 u_int32_t textEncoding;
362 u_int32_t attrBlocks;
363
364
365 HFSPlusForkData dataFork;
366 HFSPlusForkData resourceFork;
367};
368typedef struct HFSPlusCatalogFile HFSPlusCatalogFile;
369
370
371struct HFSCatalogThread {
372 int16_t recordType;
373 int32_t reserved[2];
374 u_int32_t parentID;
375 u_int8_t nodeName[kHFSMaxFileNameChars + 1];
376};
377typedef struct HFSCatalogThread HFSCatalogThread;
378
379
380struct HFSPlusCatalogThread {
381 int16_t recordType;
382 int16_t reserved;
383 u_int32_t parentID;
384 HFSUniStr255 nodeName;
385};
386typedef struct HFSPlusCatalogThread HFSPlusCatalogThread;
387
388#ifdef __APPLE_API_UNSTABLE
389
390
391
392
393enum {
394 kHFSPlusAttrInlineData = 0x10,
395 kHFSPlusAttrForkData = 0x20,
396 kHFSPlusAttrExtents = 0x30
397};
398
399
400
401
402
403
404
405
406struct HFSPlusAttrForkData {
407 u_int32_t recordType;
408 u_int32_t reserved;
409 HFSPlusForkData theFork;
410};
411typedef struct HFSPlusAttrForkData HFSPlusAttrForkData;
412
413
414
415
416
417
418struct HFSPlusAttrExtents {
419 u_int32_t recordType;
420 u_int32_t reserved;
421 HFSPlusExtentRecord extents;
422};
423typedef struct HFSPlusAttrExtents HFSPlusAttrExtents;
424
425
426
427
428
429
430
431struct HFSPlusAttrData {
432 u_int32_t recordType;
433 u_int32_t reserved[2];
434 u_int32_t attrSize;
435 u_int8_t attrData[2];
436};
437typedef struct HFSPlusAttrData HFSPlusAttrData;
438
439
440
441struct HFSPlusAttrInlineData {
442 u_int32_t recordType;
443 u_int32_t reserved;
444 u_int32_t logicalSize;
445 u_int8_t userData[2];
446};
447typedef struct HFSPlusAttrInlineData HFSPlusAttrInlineData;
448
449
450
451union HFSPlusAttrRecord {
452 u_int32_t recordType;
453 HFSPlusAttrInlineData inlineData;
454 HFSPlusAttrData attrData;
455 HFSPlusAttrForkData forkData;
456 HFSPlusAttrExtents overflowExtents;
457};
458typedef union HFSPlusAttrRecord HFSPlusAttrRecord;
459
460
461enum { kHFSMaxAttrNameLen = 127 };
462struct HFSPlusAttrKey {
463 u_int16_t keyLength;
464 u_int16_t pad;
465 u_int32_t fileID;
466 u_int32_t startBlock;
467 u_int16_t attrNameLen;
468 u_int16_t attrName[kHFSMaxAttrNameLen];
469};
470typedef struct HFSPlusAttrKey HFSPlusAttrKey;
471
472#define kHFSPlusAttrKeyMaximumLength (sizeof(HFSPlusAttrKey) - sizeof(u_int16_t))
473#define kHFSPlusAttrKeyMinimumLength (kHFSPlusAttrKeyMaximumLength - kHFSMaxAttrNameLen*sizeof(u_int16_t))
474
475#endif
476
477
478
479enum {
480 kHFSPlusExtentKeyMaximumLength = sizeof(HFSPlusExtentKey) - sizeof(u_int16_t),
481 kHFSExtentKeyMaximumLength = sizeof(HFSExtentKey) - sizeof(u_int8_t),
482 kHFSPlusCatalogKeyMaximumLength = sizeof(HFSPlusCatalogKey) - sizeof(u_int16_t),
483 kHFSPlusCatalogKeyMinimumLength = kHFSPlusCatalogKeyMaximumLength - sizeof(HFSUniStr255) + sizeof(u_int16_t),
484 kHFSCatalogKeyMaximumLength = sizeof(HFSCatalogKey) - sizeof(u_int8_t),
485 kHFSCatalogKeyMinimumLength = kHFSCatalogKeyMaximumLength - (kHFSMaxFileNameChars + 1) + sizeof(u_int8_t),
486 kHFSPlusCatalogMinNodeSize = 4096,
487 kHFSPlusExtentMinNodeSize = 512,
488 kHFSPlusAttrMinNodeSize = 4096
489};
490
491
492enum {
493
494 kHFSVolumeHardwareLockBit = 7,
495 kHFSVolumeUnmountedBit = 8,
496 kHFSVolumeSparedBlocksBit = 9,
497 kHFSVolumeNoCacheRequiredBit = 10,
498 kHFSBootVolumeInconsistentBit = 11,
499 kHFSCatalogNodeIDsReusedBit = 12,
500 kHFSVolumeJournaledBit = 13,
501 kHFSVolumeInconsistentBit = 14,
502 kHFSVolumeSoftwareLockBit = 15,
503
504 kHFSVolumeHardwareLockMask = 1 << kHFSVolumeHardwareLockBit,
505 kHFSVolumeUnmountedMask = 1 << kHFSVolumeUnmountedBit,
506 kHFSVolumeSparedBlocksMask = 1 << kHFSVolumeSparedBlocksBit,
507 kHFSVolumeNoCacheRequiredMask = 1 << kHFSVolumeNoCacheRequiredBit,
508 kHFSBootVolumeInconsistentMask = 1 << kHFSBootVolumeInconsistentBit,
509 kHFSCatalogNodeIDsReusedMask = 1 << kHFSCatalogNodeIDsReusedBit,
510 kHFSVolumeJournaledMask = 1 << kHFSVolumeJournaledBit,
511 kHFSVolumeInconsistentMask = 1 << kHFSVolumeInconsistentBit,
512 kHFSVolumeSoftwareLockMask = 1 << kHFSVolumeSoftwareLockBit,
513 kHFSMDBAttributesMask = 0x8380
514};
515
516
517
518
519struct HFSMasterDirectoryBlock {
520 u_int16_t drSigWord;
521 u_int32_t drCrDate;
522 u_int32_t drLsMod;
523 u_int16_t drAtrb;
524 u_int16_t drNmFls;
525 u_int16_t drVBMSt;
526 u_int16_t drAllocPtr;
527 u_int16_t drNmAlBlks;
528 u_int32_t drAlBlkSiz;
529 u_int32_t drClpSiz;
530 u_int16_t drAlBlSt;
531 u_int32_t drNxtCNID;
532 u_int16_t drFreeBks;
533 u_int8_t drVN[kHFSMaxVolumeNameChars + 1];
534 u_int32_t drVolBkUp;
535 u_int16_t drVSeqNum;
536 u_int32_t drWrCnt;
537 u_int32_t drXTClpSiz;
538 u_int32_t drCTClpSiz;
539 u_int16_t drNmRtDirs;
540 u_int32_t drFilCnt;
541 u_int32_t drDirCnt;
542 u_int32_t drFndrInfo[8];
543 u_int16_t drEmbedSigWord;
544 HFSExtentDescriptor drEmbedExtent;
545 u_int32_t drXTFlSize;
546 HFSExtentRecord drXTExtRec;
547 u_int32_t drCTFlSize;
548 HFSExtentRecord drCTExtRec;
549};
550typedef struct HFSMasterDirectoryBlock HFSMasterDirectoryBlock;
551
552
553#ifdef __APPLE_API_UNSTABLE
554#define SET_HFS_TEXT_ENCODING(hint) \
555 (0x656e6300 | ((hint) & 0xff))
556#define GET_HFS_TEXT_ENCODING(hint) \
557 (((hint) & 0xffffff00) == 0x656e6300 ? (hint) & 0x000000ff : 0xffffffffU)
558#endif
559
560
561
562
563struct HFSPlusVolumeHeader {
564 u_int16_t signature;
565 u_int16_t version;
566 u_int32_t attributes;
567 u_int32_t lastMountedVersion;
568 u_int32_t journalInfoBlock;
569
570 u_int32_t createDate;
571 u_int32_t modifyDate;
572 u_int32_t backupDate;
573 u_int32_t checkedDate;
574
575 u_int32_t fileCount;
576 u_int32_t folderCount;
577
578 u_int32_t blockSize;
579 u_int32_t totalBlocks;
580 u_int32_t freeBlocks;
581
582 u_int32_t nextAllocation;
583 u_int32_t rsrcClumpSize;
584 u_int32_t dataClumpSize;
585 u_int32_t nextCatalogID;
586
587 u_int32_t writeCount;
588 u_int64_t encodingsBitmap;
589
590 u_int8_t finderInfo[32];
591
592 HFSPlusForkData allocationFile;
593 HFSPlusForkData extentsFile;
594 HFSPlusForkData catalogFile;
595 HFSPlusForkData attributesFile;
596 HFSPlusForkData startupFile;
597};
598typedef struct HFSPlusVolumeHeader HFSPlusVolumeHeader;
599
600
601
602
603enum BTreeKeyLimits{
604 kMaxKeyLength = 520
605};
606
607union BTreeKey{
608 u_int8_t length8;
609 u_int16_t length16;
610 u_int8_t rawData [kMaxKeyLength+2];
611};
612typedef union BTreeKey BTreeKey;
613
614
615struct BTNodeDescriptor {
616 u_int32_t fLink;
617 u_int32_t bLink;
618 int8_t kind;
619 u_int8_t height;
620 u_int16_t numRecords;
621 u_int16_t reserved;
622};
623typedef struct BTNodeDescriptor BTNodeDescriptor;
624
625
626enum {
627 kBTLeafNode = -1,
628 kBTIndexNode = 0,
629 kBTHeaderNode = 1,
630 kBTMapNode = 2
631};
632
633
634struct BTHeaderRec {
635 u_int16_t treeDepth;
636 u_int32_t rootNode;
637 u_int32_t leafRecords;
638 u_int32_t firstLeafNode;
639 u_int32_t lastLeafNode;
640 u_int16_t nodeSize;
641 u_int16_t maxKeyLength;
642 u_int32_t totalNodes;
643 u_int32_t freeNodes;
644 u_int16_t reserved1;
645 u_int32_t clumpSize;
646 u_int8_t btreeType;
647 u_int8_t keyCompareType;
648 u_int32_t attributes;
649 u_int32_t reserved3[16];
650};
651typedef struct BTHeaderRec BTHeaderRec;
652
653
654enum {
655 kBTBadCloseMask = 0x00000001,
656 kBTBigKeysMask = 0x00000002,
657 kBTVariableIndexKeysMask = 0x00000004
658};
659
660
661
662enum {
663 kHFSCaseFolding = 0xCF,
664 kHFSBinaryCompare = 0xBC
665};
666
667
668struct JournalInfoBlock {
669 u_int32_t flags;
670 u_int32_t device_signature[8];
671 u_int64_t offset;
672 u_int64_t size;
673 u_int32_t reserved[32];
674};
675typedef struct JournalInfoBlock JournalInfoBlock;
676
677enum {
678 kJIJournalInFSMask = 0x00000001,
679 kJIJournalOnOtherDeviceMask = 0x00000002,
680 kJIJournalNeedInitMask = 0x00000004
681};
682
683
684#pragma options align=reset
685
686#ifdef __cplusplus
687}
688#endif
689
690#endif
691