147 lines
No EOL
3.5 KiB
C
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
|