Files

125 lines
2.7 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifndef _FAT32_H
#define _FAT32_H
#include "stdint.h"
#include "defs.h"
#include "disk.h"
// Macros
#define FAT32_PTR(_p) ((struct fat32_ctx*)(_p))
#define FAT32_DIR_PTR(_p) ((struct fat32_fd*)(_p))
#define FAT32_FULL_CLUST(_hi, _lo) (((uint32_t)(_hi) << 16) | (_lo))
#define FAT32_INODE_GEN(_dir, _i) ((_dir) * 100 + (_i))
// Long File Name (LFN)
#define LFN_MAX 20
#define LFN_MAX_CHARS 256
// Attributes
#define FAT32_ATTR_READ_ONLY (1 << 0)
#define FAT32_ATTR_HIDDEN (1 << 1)
#define FAT32_ATTR_SYSTEM (1 << 2)
#define FAT32_ATTR_VOLUME_ID (1 << 3)
#define FAT32_ATTR_DIRECTORY (1 << 4)
#define FAT32_ATTR_ARCHIVE (1 << 5)
#define FAT32_ATTR_LFN \
(FAT32_ATTR_READ_ONLY | FAT32_ATTR_HIDDEN \
FAT32_ATTR_SYSTEM | FAT32_ATTR_VOLUME_ID)
/* On-disk structures */
// FAT32 Bios Parameter Block & Extended BPB
struct fat32_bpb {
uint8_t bootjmp[3];
char oemName[8];
uint16_t bytesPerSect;
uint8_t sectsPerClust;
uint16_t reservedSects;
uint8_t fatCount;
uint16_t rootEntryCount;
uint16_t totalSects_16;
uint8_t mediaType;
uint16_t sectsPerFat_16;
uint16_t sectsPerTrack;
uint16_t headCount;
uint32_t hiddenSects;
uint32_t sectCount_32;
// Extended
uint32_t sectsPerFat_32;
uint16_t flags;
uint16_t fatVersion;
uint32_t rootClust;
uint16_t fsinfoSect;
uint16_t backupBootsect;
uint8_t _reserved[12];
uint8_t driveNum;
uint8_t winNTFlags;
uint8_t signature;
uint32_t volumeID;
char volumeLabel[11];
char systemID[8];
uint8_t bootcode[420];
uint16_t bootsig;
} __packed;
// FAT32 Directory Entry
struct fat32_dentry {
char name[8];
char ext[3];
uint8_t attr;
uint8_t userattr;
char undelete;
uint16_t createTime;
uint16_t createDate;
uint16_t accessDate;
uint16_t clustHigh;
uint16_t modifyTime;
uint16_t modifyDate;
uint16_t clustLow;
uint32_t size;
} __packed;
// FAT32 Long File Name entry
struct fat32_lfn {
uint8_t order;
uint8_t name1[10];
uint8_t attr;
uint8_t type;
uint8_t checksum;
uint8_t name2[12];
uint16_t zero;
uint8_t name3[4];
} __packed;
/* In memory structures */
struct fat32_ctx {
size_t offsetBase;
size_t offsetFats;
size_t offsetClusts;
struct fat32_bpb bpb;
};
struct fat32_fd {
uint32_t ptr;
uint8_t index;
uint32_t dirStart;
uint32_t dirCurrent;
struct fat32_dentry dentry;
};
// Handlers
int fat32_init(struct partition* p);
int fat32_open(char* filename, int flags, ...); /* We won't use the va_args */
void* fat32_fopen(const char* path, const char* mode);
void fat32_fclose(void* file);
int fat32_fgetc(void* file);
char* fat32_fgets(char* s, size_t n, void* file);
int fat32_fread(const void* buf, size_t size, size_t count, void* file);
int fat32_fseek(void* file, size_t offset, int whence);
long fat32_ftell(void* file);
#endif