kernel
Loading...
Searching...
No Matches
fat32.h
Go to the documentation of this file.
1/*
2 * PROJECT: MatanelOS Kernel
3 * LICENSE: NONE
4 * PURPOSE: FAT32 FileSystem Headers.
5 */
6
7#ifndef X86_KERNEL_FILESYSTEM_FAT32_HEADER
8#define X86_KERNEL_FILESYSTEM_FAT32_HEADER
9 // Standard headers, required.
10#include <stddef.h>
11#include <stdbool.h>
12#include <stdint.h>
14#include "../../mtstatus.h"
15#include "../../includes/fs.h"
16
17#define END_OF_DIRECTORY 0x00
18#define DELETED_DIR_ENTRY 0xE5
19
20
21#define FAT32_FAT_MASK 0x0FFFFFFFU
22#define FAT32_FREE_CLUSTER 0x00000000U
23#define FAT32_BAD_CLUSTER 0x0FFFFFF7U
24#define FAT32_EOC_MIN 0x0FFFFFF8U /* inclusive */
25#define FAT32_EOC_MAX 0x0FFFFFFFU /* inclusive */
26
27
28
29#ifdef _MSC_VER
30#pragma pack(push, 1)
31typedef struct _FAT32_BPB {
32#else
33typedef struct __attribute__((packed)) _FAT32_BPB {
34#endif
35 uint8_t jump[3];
36 uint8_t oem[8];
37 uint16_t bytes_per_sector;
38 uint8_t sectors_per_cluster;
39 uint16_t reserved_sector_count;
40 uint8_t num_fats;
41 uint16_t root_entry_count;
42 uint16_t total_sectors_16;
43 uint8_t media;
44 uint16_t fat_size_16;
45 uint16_t sectors_per_track;
46 uint16_t num_heads;
47 uint32_t hidden_sectors;
48 uint32_t total_sectors_32;
49 uint32_t fat_size_32;
50 uint16_t ext_flags;
51 uint16_t fs_version;
52 uint32_t root_cluster;
53 uint16_t fs_info_sector;
54 uint16_t backup_root_sector;
56#ifdef _MSC_VER
57#pragma pack(pop)
58#endif
59
60#ifdef _MSC_VER
61#pragma pack(push, 1)
62typedef struct _FAT32_DIR_ENTRY {
63#else
64typedef struct __attribute__((packed)) _FAT32_DIR_ENTRY {
65#endif
66 char name[11];
67 uint8_t attr;
68 uint8_t nt_res;
69 uint8_t crt_time_tenth;
70 uint16_t crt_time;
71 uint16_t crt_date;
72 uint16_t lst_acc_date;
73 uint16_t fst_clus_hi;
74 uint16_t wrt_time;
75 uint16_t wrt_date;
76 uint16_t fst_clus_lo;
77 uint32_t file_size;
79#ifdef _MSC_VER
80#pragma pack(pop)
81#endif
82
83#pragma pack(push,1)
84typedef struct {
85 uint8_t LDIR_Ord;
86 uint16_t LDIR_Name1[5];
87 uint8_t LDIR_Attr; // always 0x0F
88 uint8_t LDIR_Type;
89 uint8_t LDIR_Chksum;
90 uint16_t LDIR_Name2[6];
92 uint16_t LDIR_Name3[2];
94#pragma pack(pop)
95
107
108// Initialize a FAT32 FileSystem on a given block device.
109MTSTATUS fat32_init(int disk_index);
110
111// List files in root dir
112void fat32_list_root(void);
113
114typedef enum _FAT32_ATTRIBUTES {
115 ATTR_READ_ONLY = 0x01, // File is read-only
116 ATTR_HIDDEN = 0x02, // File is hidden
117 ATTR_SYSTEM = 0x04, // System file
118 ATTR_VOLUME_ID = 0x08, // Volume label
119 ATTR_DIRECTORY = 0x10, // Entry is a directory
120 ATTR_ARCHIVE = 0x20, // File should be archived
121 // Special combination values
122 ATTR_LONG_NAME = 0x0F, // Long File Name entry (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID)
124
125static inline uint16_t fat32_encode_date(uint16_t year, uint8_t month, uint8_t day) {
126 // FAT date: YYYYYYYMMMMDDDDD (since 1980)
127 return ((year - 1980) << 9) | (month << 5) | (day);
128}
129
130static inline uint16_t fat32_encode_time(uint8_t hour, uint8_t min, uint8_t sec) {
131 // FAT time: HHHHHMMMMMMSSSSS (seconds / 2)
132 return (hour << 11) | (min << 5) | (sec / 2);
133}
134
135static inline void fat32_decode_date(uint16_t date, uint16_t* year, uint8_t* month, uint8_t* day) {
136 *year = 1980 + ((date >> 9) & 0x7F); // 7 bits for year
137 *month = (date >> 5) & 0x0F; // 4 bits for month
138 *day = date & 0x1F; // 5 bits for day
139}
140
141static inline void fat32_decode_time(uint16_t time, uint8_t* hour, uint8_t* min, uint8_t* sec) {
142 *hour = (time >> 11) & 0x1F; // 5 bits for hours
143 *min = (time >> 5) & 0x3F; // 6 bits for minutes
144 *sec = (time & 0x1F) * 2; // 5 bits for seconds (2-second resolution)
145}
146
148 IN PFILE_OBJECT FileObject,
149 IN uint64_t FileOffset,
150 OUT void* Buffer,
151 IN size_t BufferSize,
152 _Out_Opt size_t* BytesRead
153);
154
160MTSTATUS fat32_create_directory(const char* path);
161
163 IN const char* path,
164 OUT PFILE_OBJECT* FileObjectOut
165);
166
168 IN PFILE_OBJECT FileObject,
169 IN uint64_t FileOffset,
170 IN void* Buffer,
171 IN size_t BufferSize,
172 _Out_Opt size_t* BytesWritten
173);
174
182MTSTATUS fat32_list_directory(const char* path, char* listings, size_t max_len);
183
189MTSTATUS fat32_delete_directory(const char* path);
190
196MTSTATUS fat32_delete_file(const char* path);
202bool fat32_directory_is_empty(const char* path);
203
204void fat32_deletion_routine(void* Object);
205
206#endif
#define _Out_Opt
Definition annotations.h:11
#define IN
Definition annotations.h:8
#define OUT
Definition annotations.h:9
MTSTATUS fat32_create_file(IN const char *path, OUT PFILE_OBJECT *FileObjectOut)
Definition fat32.c:1525
MTSTATUS fat32_init(int disk_index)
Definition fat32.c:853
MTSTATUS fat32_create_directory(const char *path)
Creates a new directory (/testdir/ or /testdir are both allowed to create 'testdir' inside of 'root')
Definition fat32.c:1136
MTSTATUS fat32_list_directory(const char *path, char *listings, size_t max_len)
Lists the directory given.
Definition fat32.c:1694
MTSTATUS fat32_delete_directory(const char *path)
This function deletes the directory given to the function from the system.
Definition fat32.c:2037
MTSTATUS fat32_read_file(IN PFILE_OBJECT FileObject, IN uint64_t FileOffset, OUT void *Buffer, IN size_t BufferSize, _Out_Opt size_t *BytesRead)
Definition fat32.c:1029
MTSTATUS fat32_write_file(IN PFILE_OBJECT FileObject, IN uint64_t FileOffset, IN void *Buffer, IN size_t BufferSize, _Out_Opt size_t *BytesWritten)
Definition fat32.c:1364
MTSTATUS fat32_delete_file(const char *path)
This function deletes the file given to the function from the system.
Definition fat32.c:2069
void fat32_deletion_routine(void *Object)
Definition fat32.c:2146
void fat32_list_root(void)
Definition fat32.c:877
bool fat32_directory_is_empty(const char *path)
This function returns if the directory given to the function is empty (e.g, has only '....
Definition fat32.c:1778
FAT32_BPB
Definition fat32.h:55
_FAT32_ATTRIBUTES
Definition fat32.h:114
@ ATTR_SYSTEM
Definition fat32.h:117
@ ATTR_LONG_NAME
Definition fat32.h:122
@ ATTR_VOLUME_ID
Definition fat32.h:118
@ ATTR_READ_ONLY
Definition fat32.h:115
@ ATTR_DIRECTORY
Definition fat32.h:119
@ ATTR_HIDDEN
Definition fat32.h:116
@ ATTR_ARCHIVE
Definition fat32.h:120
enum _FAT32_ATTRIBUTES FAT32_ATTRIBUTES
struct _FAT32_FSINFO FAT32_FSINFO
FAT32_DIR_ENTRY
Definition fat32.h:78
struct _FILE_OBJECT * PFILE_OBJECT
typedef __attribute__
Definition fat32.h:64
int32_t MTSTATUS
Definition mtstatus.h:12
uint32_t sectors_per_cluster
Definition fat32.h:101
uint32_t fat_start
Definition fat32.h:102
uint32_t total_clusters
Definition fat32.h:105
uint32_t sectors_per_fat
Definition fat32.h:99
uint32_t total_sectors
Definition fat32.h:104
uint32_t first_data_sector
Definition fat32.h:97
uint16_t reserved_sector_count
Definition fat32.h:103
uint32_t root_cluster
Definition fat32.h:98
uint32_t bytes_per_sector
Definition fat32.h:100
uint8_t LDIR_Type
Definition fat32.h:88
uint16_t LDIR_FstClusLO
Definition fat32.h:91
uint8_t LDIR_Chksum
Definition fat32.h:89
uint8_t LDIR_Attr
Definition fat32.h:87
uint16_t LDIR_Name1[5]
Definition fat32.h:86
uint8_t LDIR_Ord
Definition fat32.h:85
uint16_t LDIR_Name2[6]
Definition fat32.h:90
uint16_t LDIR_Name3[2]
Definition fat32.h:92