summaryrefslogtreecommitdiffstats
path: root/src/hfsp.h
blob: 4cbb92814d2751f92ce855055f80ca7f4eb954b4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*
    File: hfsp.h, TestDisk

    Copyright (C) 2005-2006 Christophe GRENIER <grenier@cgsecurity.org>
    Original header comes from libhfs - library for reading and writing
    Macintosh HFS volumes
    Copyright (C) 2000 Klaus Halfmann <klaus.halfmann@feri.de>
    Original work by 1996-1998 Robert Leslie <rob@mars.org>
    other work 2000 from Brad Boyer (flar@pants.nu)

    This software is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.
  
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write the Free Software Foundation, Inc., 51
    Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

 */   
#ifndef _HFSP_H
#define _HFSP_H
#ifdef __cplusplus
extern "C" {
#endif

#define HFSP_BOOT_SECTOR_SIZE 512
#define HFSP_BLOCKSZ            512	/* A sector for Apple is always 512 bytes */
#define HFSP_BLOCKSZ_BITS       9	/* 1<<9 == 512  */
#define	HFSP_VOLHEAD_SIG        0x482B  /* 'H+'	*/
#define HFSX_VOLHEAD_SIG        0x4858  /* 'HX' */

#define HFSP_VERSION    4
#define HFSX_VERSION    5

// Minimum Key size for all btrees
#define HFSP_CAT_KEY_MIN_LEN	6

// Maximum Key size for all btrees
#define HFSP_CAT_KEY_MAX_LEN	516

/* HFS+ includes POSIX permissions , although marked as reserved they will be
 * used as such. Is ignored by MacOS 8-9 but probably not by MacOS X.
 */
typedef struct {
        uint32_t         owner;
        uint32_t         group;
        uint32_t         mode;
        uint32_t         dev;
} hfsp_perm;

/* A single contiguous area (fragment) of a file */
typedef struct {
        uint32_t         start_block;
        uint32_t         block_count;
} hfsp_extent;

/* A file may contain up to 8 normale extents, all other
   are found in some extra extent area */
typedef hfsp_extent hfsp_extent_rec[8];

/* Information for a "Fork" in a file
 * Forks are the "usual" DATA and RSRC forks or special files
 * (e.g. the Volume Bitmap)
 */
typedef struct {
        uint64_t		total_size;  // logical size
        uint32_t		clump_size;  // number of bytes to preallocate
        uint32_t		total_blocks;
        hfsp_extent_rec extents;     // initial (8) extents
} hfsp_fork_raw;

/* HFS+ Volume Header
 * Always found at block 2 of the disk, a copy is stored
 * at the second to last block of the disk.
 */
typedef struct hfsp_vh {
        uint16_t         signature;   // 00: must be HFSPLUS_VOLHEAD_SIG 'H+'
        uint16_t         version;     // 02: 4 for HFS+, 5 for HFSX
        uint32_t         attributes;  // 04: See bit constants below
        uint32_t         last_mount_vers; // 08
                // Use a registered creator code here (See libhfsp.h)
		// Mac OS uses '8.10' well
        uint32_t         reserved;	// 0C
 
        uint32_t         create_date; // 10 local time !
        uint32_t         modify_date; // 14 GMT (?)
        uint32_t         backup_date; // 18 GMT (?)
        uint32_t         checked_date; // 1C GMT (?) fsck ?
 
        uint32_t         file_count;	// 20
         // not including special files but including DATA and RSRC forks
        uint32_t         folder_count; // 24 excluding the root folder
 
        uint32_t         blocksize;	// 28
         // must be multiple of HFSPLUS_SECTOR_SIZE,
         // should be a multiple of 4k for harddisk
        uint32_t         total_blocks;	// 2C
        uint32_t         free_blocks;	// 30
         // The total number of unused allocation blocks on the disk.
 
        uint32_t         next_alloc;
         // hint where to search for next allocation blocks
        uint32_t         rsrc_clump_sz;
         // default clump size for rsrc forks
        uint32_t         data_clump_sz;
         // default clump size for data forks
        uint32_t	       next_cnid;
         // next unused catalog id
        uint32_t         write_count;
         // increment on every mount (and write ?)
        uint64_t        encodings_bmp;
                // for every encoding used on the disk a bit is set
                // ignored but eventually must be cared for
        char          finder_info[32];                                      
	hfsp_fork_raw   alloc_file;
         // stores bitmap of use/free blocks
        hfsp_fork_raw   ext_file;
         // stores oferflow extents
        hfsp_fork_raw   cat_file;
	 // This contains the root directory
        hfsp_fork_raw   attr_file;
        hfsp_fork_raw   start_file;
         // a special startup file may be described here (used by ?)
} hfsp_vh;

/* HFS+ volume attributes */
/* 0-6 reserved, may be used in memory only */
#define HFSPLUS_VOL_RESERVED1 0x000000FF
#define HFSPLUS_VOL_HARDLOCK  0x00000080 // Used in Memory by finder only
#define HFSPLUS_VOL_UNMNT     0x00000100
        // clear this bit when mounting, set as last step of unmounting
        // This is checked by (slower) ROM code
#define HFSPLUS_VOL_SPARE_BLK 0x00000200
#define HFSPLUS_VOL_NOCACHE   0x00000400
        // in case of RAM or ROM disk (try a HFS+ Ramdisk :)
#define HFSPLUS_VOL_INCNSTNT  0x00000800
        // Reverse meaning as of HFSPLUS_VOL_UNMNT
        // This is checked by (faster) Mac OS code
/* 12-14 reserved */
#define HFSPLUS_VOL_RESERVED2 0x00007000
#define HFSPLUS_VOL_SOFTLOCK  0x00008000
#define HFSPLUS_VOL_RESERVED3 0xFFFF0000


int check_HFSP(disk_t *disk_car,partition_t *partition,const int verbose);
int test_HFSP(disk_t *disk_car, const struct hfsp_vh *vh, const partition_t *partition, const int verbose, const int dump_ind);
int recover_HFSP(disk_t *disk_car, const struct hfsp_vh *vh,partition_t *partition,const int verbose, const int dump_ind, const int backup);

#ifdef __cplusplus
} /* closing brace for extern "C" */
#endif
#endif