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
|
/* $OpenBSD: partition_map.h,v 1.42 2016/01/31 23:00:11 krw Exp $ */
/*
* partition_map.h - partition map routines
*
* Written by Eryk Vershen
*/
/*
* Copyright 1996,1998 by Apple Computer, Inc.
* All Rights Reserved
*
* Permission to use, copy, modify, and distribute this software and
* its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notice appears in all copies and
* that both the copyright notice and this permission notice appear in
* supporting documentation.
*
* APPLE COMPUTER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL APPLE COMPUTER BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
* NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef __partition_map__
#define __partition_map__
#define BLOCK0_SIGNATURE 0x4552 /* 'ER' */
#define DPME_SIGNATURE 0x504D /* 'PM' */
#define DPISTRLEN 32
struct ddmap {
uint32_t ddBlock; /* 1st driver's starting sbBlkSize block */
uint16_t ddSize; /* size of 1st driver (512-byte blks) */
uint16_t ddType; /* system type (1 for Mac+) */
};
struct entry;
struct partition_map {
LIST_HEAD(, entry) disk_order;
LIST_HEAD(, entry) base_order;
char *name;
int fd;
int changed;
int blocks_in_map;
int maximum_in_map;
unsigned long media_size; /* in physical blocks */
/* On-disk block 0 data. */
uint16_t sbSig; /* "ER" */
uint16_t sbBlkSize; /* physical block size of device */
uint32_t sbBlkCount; /* # of physical blocks on device */
uint16_t sbDevType; /* device type */
uint16_t sbDevId; /* device id */
uint32_t sbData; /* not used */
uint16_t sbDrvrCount; /* driver descriptor count */
struct ddmap sbDDMap[8]; /* driver descriptor map*/
uint8_t sbReserved[430];
};
struct entry {
LIST_ENTRY(entry) disk_entry;
LIST_ENTRY(entry) base_entry;
struct partition_map *the_map;
long disk_address;
/* On-disk dpme block data.*/
uint16_t dpme_signature; /* "PM" */
uint8_t dpme_reserved_1[2];
uint32_t dpme_map_entries; /* # of partition entries */
uint32_t dpme_pblock_start; /* physical block start of partition */
uint32_t dpme_pblocks; /* physical block count of partition */
char dpme_name[DPISTRLEN+1]; /* name of partition + NUL */
char dpme_type[DPISTRLEN+1]; /* type of partition + NUL */
uint32_t dpme_lblock_start; /* logical block start of partition */
uint32_t dpme_lblocks; /* logical block count of partition */
uint32_t dpme_flags;
#define DPME_OS_SPECIFIC_1 (1<<8)
#define DPME_OS_SPECIFIC_2 (1<<7)
#define DPME_OS_PIC_CODE (1<<6)
#define DPME_WRITABLE (1<<5)
#define DPME_READABLE (1<<4)
#define DPME_BOOTABLE (1<<3)
#define DPME_IN_USE (1<<2)
#define DPME_ALLOCATED (1<<1)
#define DPME_VALID (1<<0)
uint32_t dpme_boot_block; /* logical block start of boot code */
uint32_t dpme_boot_bytes; /* byte count of boot code */
uint16_t dpme_load_addr; /* memory address of boot code */
uint8_t dpme_reserved_2[4];
uint32_t dpme_goto_addr; /* memory jump address of boot code */
uint8_t dpme_reserved_3[4];
uint32_t dpme_checksum; /* of the boot code. */
char dpme_processor_id[17]; /* processor type + NUL */
uint8_t dpme_reserved_4[376];
};
extern const char *kFreeType;
extern const char *kMapType;
extern const char *kUnixType;
extern const char *kHFSType;
extern int lflag;
extern int rflag;
struct partition_map *create_partition_map(int, char *, uint64_t, uint32_t);
struct partition_map *open_partition_map(int, char *, uint64_t, uint32_t);
struct entry *find_entry_by_disk_address(long, struct partition_map *);
struct entry *find_entry_by_type(const char *, struct partition_map *);
struct entry *find_entry_by_base(uint32_t, struct partition_map *);
int add_partition_to_map(const char *, const char *, uint32_t, uint32_t,
struct partition_map *);
int contains_driver(struct entry *);
void free_partition_map(struct partition_map *);
void delete_partition_from_map(struct entry *);
void move_entry_in_map(long, long, struct partition_map *);
void resize_map(long new_size, struct partition_map *);
void write_partition_map(struct partition_map *);
void dpme_init_flags(struct entry *);
#endif /* __partition_map__ */
|