lenochka/kernel/fat.h
2019-03-29 00:27:42 +02:00

102 lines
2.1 KiB
C

#ifndef __FAT_H
#define __FAT_H
#include "os.h"
#include "disk.h"
#include "string.h"
#define FAT_BAD_CLUSTER 0xFFFFFF7
#define IS_FAT_CLUS_RESVD(a) (a >= 0xFFFFFF8 && a <= 0xFFFFFFE)
#define FAT_END_CLUSTER 0xFFFFFFF
#define FAT_CLUSTER(a) (a&0x0FFFFFFF)
#define IS_FAT_CLUS_EOF(clus) ((clus >= FAT_BAD_CLUSTER) || (clus == 0))
#define FAT_ATTR_READONLY 0x01
#define FAT_ATTR_HIDDEN 0x02
#define FAT_ATTR_SYSTEM 0x04
#define FAT_ATTR_VOLUME_ID 0x08
#define FAT_ATTR_DIRECTORY 0x10
#define FAT_ATTR_ARCHIVE 0x20
#define FAT_ATTR_LONG_NAME (FAT_ATTR_READONLY \
|FAT_ATTR_HIDDEN \
|FAT_ATTR_SYSTEM \
|FAT_ATTR_VOLUME_ID)
#define IS_VALID_FAT(fat) (fat->disk != NULL)
typedef struct {
disk_t* disk;
u32 bps; //11 2
u32 spc; //13 1
u32 rsvdsec; //14 2
u32 fatnum; //16 1
u32 rootentcnt; //17 2
u32 totsec; //32 4
u32 fatsz; //36 4
u32 rootclus; //44 4
u32 fatentperclus;
u32 dirsperclus;
u32 fatsec;
u32 datasec;
u8* secbuf;
u8* clusbuf;
u8* clusbuf_ex;
u32* fatbuf;
u32 cursec;
u32 curclus;
u32 curfatclus;
} fat_t;
typedef struct {
char dir_name[11];
u8 dir_attr;
u8 dir_ntres;
u8 dir_crttimetenth;
u16 dir_crttime;
u16 dir_crtdate;
u16 dir_lstaccdate;
u16 dir_fstclushi;
u16 dir_wrttime;
u16 dir_wrtdate;
u16 dir_fstcluslo;
u32 dir_filesize;
} __packed fat_dir_t;
#define IS_FAT_LDIR_LAST(ord) (ord&0x40)
typedef struct {
u8 ldir_ord;
dbcs_t ldir_name1[5];
u8 ldir_attr;
u8 ldir_type;
u8 ldir_chksum;
dbcs_t ldir_name2[6];
u16 ldir_fstcluslo;
dbcs_t ldir_name3[2];
} __packed fat_ldir_t;
void fat_init(fat_t* fat,disk_t* disk);
void fat_read_cluster(fat_t* fat,u32 clus);
u32 fat_table_read_entry(fat_t* fat,u32 idx);
void fat_read_file(fat_t* fat,fat_dir_t* file,u8* __virt buf);
void fat_nametofmt38(const char* name,char* out);
void fat_fmt38toname(const char* name,char* out);
int fat_is_valid_file(fat_dir_t* file);
u64 fat_first_file(fat_t* fat,fat_dir_t* parent,fat_dir_t* file,
char* longname);
u64 fat_next_file(fat_t* fat,u64 val,fat_dir_t* file,char* longname);
int fat_find_file(fat_t* fat,fat_dir_t* parent,char* name,
fat_dir_t* out);
extern fat_t g_fat;
#endif