#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