#define GUID_TYPE_EMPTY MAKE_GUID(0,0,0,0,0) #define GUID_TYPE_SYSTEM MAKE_GUID(C12A7328,F81F,11D2,BA4B,00A0C93EC93B) #define GUID_TYPE_LINUX_EXT3 MAKE_GUID(EBD0A0A2,B9E5,4433,87C0,68B6B72699C7) #define GUID_TYPE_LINUX_SWAP MAKE_GUID(0657FD6D,A4AB,43C4,84E5,0933C84B4F4F) #define GUID_TYPE_APPLE_HFS MAKE_GUID(48465300,0000,11AA,AA11,00306543ECAC) #define GUID_TYPE_APPLE_RECOVERY MAKE_GUID(426F6F74,0000,11AA,AA11,00306543ECAC) #define GUID_TYPE_APPLE_RAID MAKE_GUID(52414944,0000,11AA,AA11,00306543ECAC) #define GUID_TYPE_APPLE_BOOTER MAKE_GUID(426F6F74,0000,11AA,AA11,00306543ECAC) #define GUID_TYPE_APPLE_TV MAKE_GUID(5265636F,7665,11AA,AA11,00306543ECAC) #define GUID_TYPE_LINUX_LVM MAKE_GUID(E6D6D379,F507,44C2,A23C,238F2A3DF928) #define GUID_TYPE_LINUX_RAID MAKE_GUID(A19D880F,05FC,4D3B,A006,743F0F84911E) #define GUID_TYPE_NEW_LINUX_EXT3 MAKE_GUID(0FC63DAF,8483,4772,8E79,3D69D8477DE4) #define GPT_ENTRY_FLAG_SYSTEM 1 typedef struct { GUID type; GUID label; uint64_t start; uint64_t end; uint64_t flags; uint8_t name[72]; } PACKED GPT_entry; #define GPT_HEADER_SIGNATURE "EFI PART" #define GPT_HEADER_REVISION_EFI10 0x00010000 #define GPT_PARITION_ENTRIES 128 #define SECTOR_SIZE 512 #define GPT_ENTRIES_PER_SECTOR(h) (SECTOR_SIZE/((h)->partition_entry_size)) #define GPT_ENTRY_LBA(h,n) (((h)->partition_entry_lba)+(uint64_t) ((n)/GPT_ENTRIES_PER_SECTOR(h))) #define GPT_ENTRY_OFFSET(h,n) (((n)%GPT_ENTRIES_PER_SECTOR(h))*((h)->partition_entry_size)) typedef struct { uint8_t signature[8]; uint32_t revision; uint32_t header_size; uint32_t header_crc; uint8_t reserved[4]; uint64_t my_lba; uint64_t alternate_lba; uint64_t first_usable_lba; uint64_t last_usable_lba; GUID disk_guid; uint64_t partition_entry_lba; uint32_t n_partition_entries; uint32_t partition_entry_size; uint32_t partition_entry_crc; } PACKED GPT_header; #define MBR_PARTITION_TYPE_EFI 0xee #define MBR_PARTITION_TYPE_LINUX 0x83 #define MBR_PARTITION_TYPE_SWAP 0x82 #define MBR_PARTITION_TYPE_LVM 0x8e #define MBR_PARTITION_TYPE_RAID 0xfd #define MBR_PARTITION_TYPE_HFS 0xaf #define MBR_PARTITION_TYPE_UNKOWN 0xff #define MBR_PARTITION_BOOTABLE 0x80 #define MBR_SECTOR(a) ((a) & 0x3f) #define MBR_CYLINDER(a) (((a) & 0xc0 ) << 2 | (((a)>>8) & 0xff )) #define MBR_CS(c,s) (((s) & 0x3f) | (((c) & 0xff) <<8 ) | (((c) & 0x300) >> 2)) typedef struct { uint8_t head; uint16_t cs; } PACKED CHS; typedef struct { uint8_t bootable; CHS chs_start; uint8_t system; CHS chs_end; uint32_t start; uint32_t size; } PACKED MBR_entry; #define MBR_SIGNATURE "\125\252" typedef struct { uint8_t boot_code[440]; uint8_t uid[4]; uint8_t reserved[2]; MBR_entry entry[4]; uint8_t signature[2]; } PACKED MBR; typedef struct { GPT_header header, alt_header; } GPT_headers;