os3/libfat/include/libfat.h
2022-09-24 22:30:25 -04:00

147 lines
No EOL
3.5 KiB
C

#ifndef __OS3_LIBFAT_H
#define __OS3_LIBFAT_H
#include "datatypes.h"
#include "packing.h"
#define LIBFAT_SEEK_ORIGIN 0
#define LIBFAT_SEEK_CURRENT 1
#define LIBFAT_SEEK_END 2
typedef os_u32 (*ReadRoutine)(os_u32 amount, void* buffer, void* user_data);
typedef os_u32 (*WriteRoutine)(os_u32 amount, void* buffer, void* user_data);
typedef os_bool (*SeekRoutine)(os_u32 offset, os_u32 direction, void* user_data);
typedef os_u32 (*TellRoutine)(void* user_data);
typedef void (*PrintNumber)(os_u32 number);
typedef void (*PrintRoutine)(os_s8* data, os_u16 size);
typedef struct _FileHandle {
ReadRoutine read;
WriteRoutine write;
SeekRoutine seek;
TellRoutine tell;
void* user_data;
} FileHandle;
OS_PACK_START
struct _FatHeader_12 {
os_u8 jump[3];
os_s8 oem[8];
os_u16 bytes_per_sector;
os_u8 sectors_per_cluster;
os_u16 reserved_sectors;
os_u8 number_of_fats;
os_u16 root_dir_entries;
os_u16 logical_sectors;
os_u8 media_descriptor;
os_u16 sectors_per_fat;
os_u16 sectors_per_track;
os_u16 num_heads;
os_u16 hidden_sectors;
} OS_PACK_MID;
OS_PACK_END
typedef struct _FatHeader_12 FatHeader_12;
OS_PACK_START
struct _FatHeader_16 {
FatHeader_12 base;
os_u16 hidden_sectors_high;
os_u32 total_sectors;
os_u8 drive_number;
os_u8 reserved;
os_u8 extended_signature; //0x28 / 0x29
os_u32 serial;
os_s8 volume_label[11];
os_s8 fat_type[8];
} OS_PACK_END;
OS_PACK_END
typedef struct _FatHeader_16 FatHeader_16;
OS_PACK_START
struct _FatHeader_32 {
FatHeader_12 base;
os_u16 hidden_sectors_high;
os_u32 total_sectors;
os_u32 sectors_per_fat_32;
os_u16 mirror_flags;
os_u16 fs_version;
os_u32 first_root_cluster;
os_u16 fsinfo_sector;
os_u16 backup_boot_location;
os_u8 reserved_fat32[12];
os_u8 logical_drive_number;
os_u8 reserved_winnt;
os_u8 extended_sig_fat32; //0x29
os_u32 serial_number;
os_s8 volume_label[11];
os_s8 fat_type[8];
} OS_PACK_MID;
OS_PACK_END;
#define FAT_READONLY_BIT 1
#define FAT_HIDDEN_BIT 2
#define FAT_SYSTEM_BIT 4
#define FAT_VOLUME_BIT 8
#define FAT_SUBDIRECTORY_BIT 16
#define FAT_ARCHIVE_BIT 32
#define FAT_LAST_CLUSTER_32 0xFFFFFFF8
OS_PACK_START
struct _FatDirectoryEntry {
os_s8 file_name[8];
os_s8 extension[3];
os_s8 attribute;
os_u8 reserved[8];
os_u16 start_cluster_high;
os_u16 time;
os_u16 date;
os_u16 start_cluster;
os_u32 file_size;
} OS_PACK_MID;
OS_PACK_END
typedef struct _FatDirectoryEntry FatDirectoryEntry;
typedef struct _FatHeader_32 FatHeader_32;
typedef struct _FatControlBlock {
FileHandle handle;
FatHeader_32 header;
os_u32 first_loaded_cluster;
os_u32* loaded_fat_segment;
os_u32 loaded_fat_cluster_amount;
} FatControlBlock;
typedef struct _LibFatFile {
FatControlBlock* fat;
FatDirectoryEntry file_entry;
os_u32 current_cluster;
os_u32 position;
os_u32 in_cluster_position;
os_u32 fat_data_offset;
os_u32 fat_cluster_size;
} LibFatFile;
typedef struct _LibFatDirectory {
FatControlBlock* fat;
os_u32 fat_cluster_size;
os_u32 base_cluster;
os_u32 current_cluster;
os_u32 position_in_cluster;
os_bool done;
} LibFatDirectory;
extern os_bool libfat_init(FileHandle handle, void* buffer, os_u32 buffer_size, FatControlBlock* result);
extern os_bool libfat_open_read(FatControlBlock* fat, FatDirectoryEntry* entry, LibFatFile* result);
extern os_u32 libfat_read(LibFatFile* file, void* buffer, os_u32 buffer_size);
extern os_u32 libfat_tell(LibFatFile* file);
extern os_bool libfat_open_directory(FatControlBlock* fat, FatDirectoryEntry* entry, LibFatDirectory* result);
extern void libfat_test(FileHandle image_file, PrintRoutine print, PrintNumber rintNumber);
#endif //!__OS3_LIBFAT_H