trios/kernel/fs/fat.h

73 lines
1.4 KiB
C

#pragma once
#include "mbr.h"
enum FatType {
FAT12,
FAT16,
FAT32,
};
struct FatBpb {
uint8_t _instrs[3];
uint8_t oem_ident[8];
uint16_t bytes_per_sector;
uint8_t sectors_per_cluster;
uint16_t reserved_sectors;
uint8_t fat_count;
uint16_t root_entries;
uint16_t total_sectors_16;
uint8_t media_descriptor;
uint16_t sectors_per_fat;
uint16_t sectors_per_track;
uint16_t heads;
uint32_t hidden_sectors;
uint32_t total_sectors_32;
} __attribute__((packed));
struct Fat16Ebpb {
uint8_t drive_number;
uint8_t _reserved;
uint8_t signature;
uint32_t volume_id;
uint8_t volume_label[11];
uint8_t sys_ident[8];
} __attribute__((packed));
struct Fat32Ebpb {
uint32_t sectors_per_fat;
uint16_t flags;
uint16_t version;
uint32_t root_cluster;
uint16_t fsinfo_sector;
uint16_t backup_boot_sector;
uint8_t _reserved0[12];
uint8_t drive_number;
uint8_t _reserved1;
uint8_t signature;
uint32_t serial_number;
uint8_t volume_label[11];
uint8_t system_ident[8];
} __attribute__((packed));
struct FatInfo {
struct MbrPartition partition;
struct AtaDevice dev;
enum FatType type;
struct FatBpb bpb;
union {
struct Fat16Ebpb f16;
struct Fat32Ebpb f32;
} ebpb;
};
struct FatFile {
uint8_t name[11];
uint8_t attributes;
uint32_t start_cluster;
uint32_t size;
};
bool fat_init(struct FatInfo *fatinfo, struct AtaDevice dev, struct MbrPartition partition);
bool fat_test(struct FatInfo *fatinfo);