XenevaOS
Loading...
Searching...
No Matches
Fat.h
Go to the documentation of this file.
1
30#ifndef __FAT_H__
31#define __FAT_H__
32
33#include <stdint.h>
34#include <Fs/vdisk.h>
35#ifdef ARCH_X64
36#include <Sync/mutex.h>
37#endif
38#include <Fs/vfs.h>
39
40#define FAT_ATTRIBUTE_MASK 0x3F
41#define FAT_ATTRIBUTE_READ_ONLY 0x01
42#define FAT_ATTRIBUTE_HIDDEN 0x02
43#define FAT_ATTRIBUTE_SYSTEM 0x04
44#define FAT_ATTRIBUTE_VOLUME 0x08
45#define FAT_ATTRIBUTE_DIRECTORY 0x10
46#define FAT_ATTRIBUTE_ARCHIVE 0x20
47#define FAT_ATTRIBUTE_LONG_NAME 0x0F
48
49#define FAT_EOC_MARK 0xFFFFFFF8
50#define FAT_BAD_CLUSTER 0xFFFFFFF7
51
52/* FAT32 end-of-chain marks span 0x0FFFFFF8-0x0FFFFFFF, and mkfs/mtools
53 * terminate chains with 0x0FFFFFFF. Equality against FAT_EOC_MARK alone
54 * misses that terminator, so cluster-chain walks must use this range
55 * test -- otherwise they step off the end of the chain and loop forever. */
56#define FAT_IS_EOC(clust) ((((uint32_t)(clust)) & 0x0FFFFFFF) >= (FAT_EOC_MARK & 0x0FFFFFFF))
57
58
59#ifdef ARCH_X64
60#pragma pack(push,1)
61#endif
62/* FAT BPB */
63typedef struct _FAT_BPB_ {
65 char oemid[8]; //0x03 -- 8
69 uint8_t num_fats; //0x010 1
75 uint16_t heads; //0x01A 2
78 union {
79 struct {
84 char vol_label[11];
85 char sys_id[8];
87
88 struct {
90 uint16_t falgs; //0x028 2
95 uint8_t reserved[12]; //0x034 12
98 uint8_t signature; //0x042 1
99 uint32_t vol_serial_num; //0x043 4
100 char vol_label[11]; //0x047 11
101 char sys_id[8]; //0x052 8
105#ifdef ARCH_X64
106#pragma pack(pop)
107#endif
108
110#pragma pack (push, 1)
126#pragma pack(pop)
127
128/*
129 * Long file name entry
130 */
131#pragma pack(push,1)
142#pragma pack(pop)
143
144#define FSTYPE_FAT12 1
145#define FSTYPE_FAT16 2
146#define FSTYPE_FAT32 3
147
148
149typedef struct _FatFS_ {
152 char oemid[8];
154 unsigned long __FatBeginLBA;
155 unsigned long __ClusterBeginLBA;
156 unsigned char __SectorPerCluster;
158 unsigned long __RootSector;
159 unsigned int __SectorPerFAT32;
160 unsigned int __TotalClusters;
161 unsigned char* __RootDirCache;
162 unsigned int __LastIndexSector;
163 unsigned int __LastIndexInFat;
167#ifdef ARCH_X64
168 AuMutex *fat_mutex;
169 AuMutex *fat_write_mutex;
170 AuMutex *fat_read_mutex;
171#endif
173
174
175
176/*
177* FatInitialise -- initialise the fat file system
178* @param vdisk -- Pointer to vdisk structure
179* @param mountpoint -- mount point name
180*/
181extern AuVFSNode* FatInitialise(AuVDisk *vdisk, char* mountpoint);
182
183/*
184* FatClusterToSector32 -- Converts a cluster to sector
185* @param cluster -- cluster number
186*/
187extern uint64_t FatClusterToSector32(FatFS *fs, uint64_t cluster);
188
196extern void FatToDOSFilename(const char* filename, char* fname, unsigned int fname_length);
197
198/*
199 * FatCalculateCheckSum -- returns an unsigned byte checksum computed on an
200 * unsigned byte array. The array must be 11 bytes long and is assumed to
201 * contain a name stored in the format of a MS-DOS directory entry
202 * @param filename -- Pointer to an unsigned byte array assumed to be
203 * 11 bytes long
204 */
205extern uint8_t FatCalculateCheckSum(uint8_t* filename);
206
207/*
208 * FatCheckDotCount -- checks the number of '.' dot
209 * count in a given filename
210 * @param filename -- name of the file to check
211 */
212extern uint8_t FatCheckDotCount(char* filename);
213
214/*
215* FatFindFreeCluster -- finds a free cluster from FAT
216* data structure
217* @param node -- fs node
218*/
220
221/*
222* FatAllocCluster -- allocates a cluster by writing
223* n_value
224* @param fsys -- Pointer to file system node
225* @param position -- position of the cluster
226* @param n_value -- value to write
227*/
228extern void FatAllocCluster(AuVFSNode* fsys, int position, uint32_t n_value);
229
234extern void FatClearCluster(AuVFSNode* node, uint32_t cluster);
235
236/*
237* FatReadFAT -- read the file allocation table
238* @param vdisk -- pointer to vdisk
239* @param cluster_index -- index of the cluster
240*/
241extern uint32_t FatReadFAT(AuVFSNode *node, uint64_t cluster_index);
242
246extern AuVFSNode * FatOpen(AuVFSNode * fsys, char* filename);
247
248/*
249* FatFormatDate -- returns fat formated date stamp
250*/
251extern uint16_t FatFormatDate();
252
253/*
254* FatFormatTime -- returns fat formated time stamp
255*/
256extern uint16_t FatFormatTime();
257
258
259AuVFSNode* FatLocateDir(AuVFSNode* fsys, const char* dir);
260
261AuVFSNode* FatLocateSubDir(AuVFSNode* fsys, AuVFSNode* kfile, const char* filename);
262
263/*
264* FatFromDosToFilename -- converts fat directoy entry filename
265* to human readable filename
266*/
267extern void FatFromDosToFilename(char* filename, char* dirfname);
268
269#endif
struct _FAT_BPB_ FatBPB
uint16_t FatFormatTime()
Definition Fat.cpp:675
uint64_t FatClusterToSector32(FatFS *fs, uint64_t cluster)
Definition Fat.cpp:62
void FatToDOSFilename(const char *filename, char *fname, unsigned int fname_length)
Definition Fat.cpp:73
AuVFSNode * FatLocateDir(AuVFSNode *fsys, const char *dir)
Definition Fat.cpp:425
uint8_t FatCheckDotCount(char *filename)
Definition Fat.cpp:127
AuVFSNode * FatOpen(AuVFSNode *fsys, char *filename)
Definition Fat.cpp:490
AuVFSNode * FatInitialise(AuVDisk *vdisk, char *mountpoint)
Definition Fat.cpp:585
void FatFromDosToFilename(char *filename, char *dirfname)
Definition Fat.cpp:140
void FatClearCluster(AuVFSNode *node, uint32_t cluster)
Definition Fat.cpp:272
void FatAllocCluster(AuVFSNode *fsys, int position, uint32_t n_value)
Definition Fat.cpp:238
AuVFSNode * FatLocateSubDir(AuVFSNode *fsys, AuVFSNode *kfile, const char *filename)
Definition Fat.cpp:365
uint32_t FatReadFAT(AuVFSNode *node, uint64_t cluster_index)
Definition Fat.cpp:168
struct _fat_lfn_ FatLFN
uint32_t FatFindFreeCluster(AuVFSNode *node)
Definition Fat.cpp:193
struct _fat_dir_ FatDir
uint8_t FatCalculateCheckSum(uint8_t *filename)
Definition Fat.cpp:114
struct _FatFS_ FatFS
uint16_t FatFormatDate()
Definition Fat.cpp:668
unsigned int uint32_t
Definition acefiex.h:163
unsigned char uint8_t
Definition acefiex.h:161
COMPILER_DEPENDENT_UINT64 uint64_t
Definition acefiex.h:165
unsigned short int uint16_t
Definition acefiex.h:162
void int node
Definition kthread.h:31
Definition Fat.h:63
uint8_t num_fats
Definition Fat.h:69
uint8_t media_type
Definition Fat.h:72
uint16_t falgs
Definition Fat.h:90
uint16_t sectors_per_track
Definition Fat.h:74
uint16_t bytes_per_sector
Definition Fat.h:66
uint16_t fs_info_sect
Definition Fat.h:93
uint16_t fat_version
Definition Fat.h:91
uint32_t hidden_sectors
Definition Fat.h:76
uint32_t sect_per_fat32
Definition Fat.h:89
char sys_id[8]
Definition Fat.h:85
uint8_t signature
Definition Fat.h:82
uint8_t drive_number
Definition Fat.h:96
uint8_t jmp[3]
Definition Fat.h:64
uint8_t flagsWinNT
Definition Fat.h:97
uint16_t backup_boot_sect
Definition Fat.h:94
uint8_t drive_num
Definition Fat.h:80
char oemid[8]
Definition Fat.h:65
uint8_t WinNtFlags
Definition Fat.h:81
uint32_t root_dir_cluster
Definition Fat.h:92
struct _FAT_BPB_::@57::@59 FAT32
struct _FAT_BPB_::@57::@58 FAT16
uint32_t vol_serial_num
Definition Fat.h:83
uint16_t heads
Definition Fat.h:75
uint16_t sectors_per_fat
Definition Fat.h:73
union _FAT_BPB_::@57 info
uint16_t num_dir_entries
Definition Fat.h:70
uint8_t sectors_per_cluster
Definition Fat.h:67
uint16_t reserved_sectors
Definition Fat.h:68
uint32_t large_sector_count
Definition Fat.h:77
uint16_t total_sectors_short
Definition Fat.h:71
uint8_t reserved[12]
Definition Fat.h:95
char vol_label[11]
Definition Fat.h:84
Definition Fat.h:149
unsigned long __FatBeginLBA
Definition Fat.h:154
unsigned char * __RootDirCache
Definition Fat.h:161
unsigned int __LastIndexSector
Definition Fat.h:162
unsigned long __ClusterBeginLBA
Definition Fat.h:155
unsigned long __RootSector
Definition Fat.h:158
unsigned char __SectorPerCluster
Definition Fat.h:156
uint8_t fatType
Definition Fat.h:153
size_t cluster_sz_in_bytes
Definition Fat.h:165
uint16_t __BytesPerSector
Definition Fat.h:164
unsigned int __LastIndexInFat
Definition Fat.h:163
AuVDisk * vdisk
Definition Fat.h:151
FatBPB * bpb
Definition Fat.h:150
unsigned int __SectorPerFAT32
Definition Fat.h:159
unsigned int __TotalClusters
Definition Fat.h:160
unsigned int __RootDirFirstCluster
Definition Fat.h:157
char oemid[8]
Definition Fat.h:152
void * _scratchBuffer
Definition Fat.h:166
Definition vdisk.h:81
Definition vfs.h:129
Definition Fat.h:112
uint16_t date_last_accessed
Definition Fat.h:119
uint16_t first_cluster_hi_bytes
Definition Fat.h:120
uint8_t reserved
Definition Fat.h:115
uint8_t filename[11]
Definition Fat.h:113
uint32_t file_size
Definition Fat.h:124
uint16_t date_created
Definition Fat.h:118
uint16_t last_wrt_date
Definition Fat.h:122
uint8_t attrib
Definition Fat.h:114
uint16_t time_created
Definition Fat.h:117
uint16_t first_cluster
Definition Fat.h:123
uint16_t last_wrt_time
Definition Fat.h:121
uint8_t time_created_ms
Definition Fat.h:116
Definition Fat.h:132
uint8_t checkSum
Definition Fat.h:137
uint8_t type
Definition Fat.h:136
uint8_t attrib
Definition Fat.h:135
uint8_t nameOne[10]
Definition Fat.h:134
uint8_t nameTwo[12]
Definition Fat.h:138
uint8_t nameThree[4]
Definition Fat.h:140
uint8_t order
Definition Fat.h:133
uint16_t FstClusterLo
Definition Fat.h:139
Definition mutex.h:40