2022-11-14 20:18:36 +01:00
|
|
|
#ifndef DEVICEWRAPPERSTRUCTS_H
|
|
|
|
#define DEVICEWRAPPERSTRUCTS_H
|
|
|
|
|
|
|
|
/*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
* Copyright (C) 2022 Raspberry Pi Ltd
|
|
|
|
*/
|
|
|
|
|
2022-11-15 01:15:08 +01:00
|
|
|
#include <stdint.h>
|
|
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
|
|
2022-11-14 20:18:36 +01:00
|
|
|
/* MBR on-disk structures */
|
|
|
|
|
|
|
|
struct mbr_partition_entry {
|
|
|
|
unsigned char bootable;
|
|
|
|
char begin_hsc[3];
|
|
|
|
unsigned char id;
|
|
|
|
char end_hsc[3];
|
2022-11-20 14:46:58 +01:00
|
|
|
uint32_t starting_sector;
|
|
|
|
uint32_t nr_of_sectors;
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
struct mbr_table {
|
|
|
|
char bootcode[440];
|
|
|
|
unsigned char diskid[4];
|
|
|
|
unsigned char flags[2];
|
|
|
|
mbr_partition_entry part[4];
|
|
|
|
unsigned char signature[2];
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
2022-11-20 14:46:58 +01:00
|
|
|
/* GUID on-disk structures
|
|
|
|
* https://www.intel.com/content/dam/www/public/us/en/zip/efi-110.zip (p. 369)
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct gpt_header {
|
|
|
|
char Signature[8];
|
|
|
|
uint32_t Revision;
|
|
|
|
uint32_t HeaderSize;
|
|
|
|
uint32_t HeaderCRC32;
|
|
|
|
uint32_t Reserved;
|
|
|
|
uint64_t MyLBA;
|
|
|
|
uint64_t AlternateLBA;
|
|
|
|
uint64_t FirstUsableLBA;
|
|
|
|
uint64_t LastUsableLBA;
|
|
|
|
unsigned char DiskGUID[16];
|
|
|
|
uint64_t PartitionEntryLBA;
|
|
|
|
uint32_t NumberOfPartitionEntries;
|
|
|
|
uint32_t SizeOfPartitionEntry;
|
|
|
|
uint32_t PartitionEntryArrayCRC32;
|
|
|
|
char Reserved2[420]; /* Assuming 512 byte sectors */
|
|
|
|
};
|
|
|
|
|
|
|
|
struct gpt_partition {
|
|
|
|
unsigned char PartitionTypeGuid[16];
|
|
|
|
unsigned char UniquePartitionGuid[16];
|
|
|
|
uint64_t StartingLBA;
|
|
|
|
uint64_t EndingLBA;
|
|
|
|
uint64_t Attributes;
|
|
|
|
char PartitionName[72];
|
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
/* File Allocation Table
|
|
|
|
* https://academy.cba.mit.edu/classes/networking_communications/SD/FAT.pdf
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct fat16_bpb {
|
|
|
|
uint8_t BS_jmpBoot[3];
|
|
|
|
char BS_OEMName[8];
|
|
|
|
uint16_t BPB_BytsPerSec;
|
|
|
|
uint8_t BPB_SecPerClus;
|
|
|
|
uint16_t BPB_RsvdSecCnt;
|
|
|
|
uint8_t BPB_NumFATs;
|
|
|
|
uint16_t BPB_RootEntCnt;
|
|
|
|
uint16_t BPB_TotSec16;
|
|
|
|
uint8_t BPB_Media;
|
|
|
|
uint16_t BPB_FATSz16;
|
|
|
|
uint16_t BPB_SecPerTrk;
|
|
|
|
uint16_t BPB_NumHeads;
|
|
|
|
uint32_t BPB_HiddSec;
|
|
|
|
uint32_t BPB_TotSec32;
|
|
|
|
|
|
|
|
uint8_t BS_DrvNum;
|
|
|
|
uint8_t BS_Reserved1;
|
|
|
|
uint8_t BS_BootSig;
|
|
|
|
uint32_t BS_VolID;
|
|
|
|
char BS_VolLab[11];
|
|
|
|
char BS_FilSysType[8];
|
|
|
|
|
|
|
|
uint8_t Zeroes[448];
|
|
|
|
uint8_t Signature[2]; /* 0x55aa */
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
struct fat32_bpb {
|
|
|
|
uint8_t BS_jmpBoot[3];
|
|
|
|
char BS_OEMName[8];
|
|
|
|
uint16_t BPB_BytsPerSec;
|
|
|
|
uint8_t BPB_SecPerClus;
|
|
|
|
uint16_t BPB_RsvdSecCnt;
|
|
|
|
uint8_t BPB_NumFATs;
|
|
|
|
uint16_t BPB_RootEntCnt;
|
|
|
|
uint16_t BPB_TotSec16;
|
|
|
|
uint8_t BPB_Media;
|
|
|
|
uint16_t BPB_FATSz16;
|
|
|
|
uint16_t BPB_SecPerTrk;
|
|
|
|
uint16_t BPB_NumHeads;
|
|
|
|
uint32_t BPB_HiddSec;
|
|
|
|
uint32_t BPB_TotSec32;
|
|
|
|
|
|
|
|
uint32_t BPB_FATSz32;
|
|
|
|
uint16_t BPB_ExtFlags;
|
|
|
|
uint16_t BPB_FSVer;
|
|
|
|
uint32_t BPB_RootClus;
|
|
|
|
uint16_t BPB_FSInfo;
|
|
|
|
uint16_t BPB_BkBootSec;
|
|
|
|
uint8_t BPB_Reserved[12];
|
|
|
|
uint8_t BS_DrvNum;
|
|
|
|
uint8_t BS_Reserved1;
|
|
|
|
uint8_t BS_BootSig;
|
|
|
|
uint32_t BS_VolID;
|
|
|
|
char BS_VolLab[11];
|
|
|
|
char BS_FilSysType[8];
|
|
|
|
|
|
|
|
uint8_t Zeroes[420];
|
|
|
|
uint8_t Signature[2]; /* 0x55aa */
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
union fat_bpb {
|
|
|
|
struct fat16_bpb fat16;
|
|
|
|
struct fat32_bpb fat32;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct dir_entry {
|
2022-11-15 01:15:08 +01:00
|
|
|
unsigned char DIR_Name[11];
|
2022-11-14 20:18:36 +01:00
|
|
|
uint8_t DIR_Attr;
|
|
|
|
uint8_t DIR_NTRes;
|
|
|
|
uint8_t DIR_CrtTimeTenth;
|
|
|
|
uint16_t DIR_CrtTime;
|
|
|
|
uint16_t DIR_CrtDate;
|
|
|
|
uint16_t DIR_LstAccDate;
|
|
|
|
uint16_t DIR_FstClusHI;
|
|
|
|
uint16_t DIR_WrtTime;
|
|
|
|
uint16_t DIR_WrtDate;
|
|
|
|
uint16_t DIR_FstClusLO;
|
|
|
|
uint32_t DIR_FileSize;
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
struct longfn_entry {
|
|
|
|
uint8_t LDIR_Ord;
|
|
|
|
char LDIR_Name1[10];
|
|
|
|
uint8_t LDIR_Attr;
|
|
|
|
uint8_t LDIR_Type;
|
|
|
|
uint8_t LDIR_Chksum;
|
|
|
|
char LDIR_Name2[12];
|
|
|
|
uint16_t LDIR_FstClusLO;
|
|
|
|
char LDIR_Name3[4];
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
#define LAST_LONG_ENTRY 0x40
|
|
|
|
|
|
|
|
#define ATTR_READ_ONLY 0x01
|
|
|
|
#define ATTR_HIDDEN 0x02
|
|
|
|
#define ATTR_SYSTEM 0x04
|
|
|
|
#define ATTR_VOLUME_ID 0x08
|
|
|
|
#define ATTR_DIRECTORY 0x10
|
|
|
|
#define ATTR_ARCHIVE 0x20
|
|
|
|
#define ATTR_LONG_NAME (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID)
|
|
|
|
|
|
|
|
struct FSInfo {
|
|
|
|
uint8_t FSI_LeadSig[4]; /* 0x52 0x52 0x61 0x41 */
|
|
|
|
uint8_t FSI_Reserved1[480];
|
|
|
|
uint8_t FSI_StrucSig[4]; /* 0x72 0x72 0x41 0x61 */
|
|
|
|
uint32_t FSI_Free_Count;
|
|
|
|
uint32_t FSI_Nxt_Free;
|
|
|
|
uint8_t FSI_Reserved2[12];
|
|
|
|
uint8_t FSI_TrailSig[4]; /* 0x00 0x00 0x55 0xAA */
|
2022-11-15 01:15:08 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#pragma pack(pop)
|
2022-11-14 20:18:36 +01:00
|
|
|
|
|
|
|
#endif // DEVICEWRAPPERSTRUCTS_H
|