kernel
Loading...
Searching...
No Matches
vfs.c
Go to the documentation of this file.
1/*
2 * PROJECT: MatanelOS Kernel
3 * LICENSE: GPLv3
4 * PURPOSE: Virtual File System (VFS) Implementation.
5 */
6
7#include "../../includes/fs.h"
8#include "../../includes/ob.h"
9
11#include "../fat32/fat32.h"
13
14typedef struct MOUNTED_FS {
16 uint8_t device_id;
17 const char* mount_point; // e.g., "/", "/ext2"
19
20#define MAX_MOUNTS 4
21static MOUNTED_FS mounted_fs[MAX_MOUNTS];
22static uint8_t mount_count = 0;
23
24#define MAIN_FS_DEVICE 0
25
27
28static MOUNTED_FS* vfs_find_fs_for_path(const char* path) {
29 if (!path) return NULL;
30 for (uint8_t i = 0; i < mount_count; i++) {
31 const char* mount = mounted_fs[i].mount_point;
32 // root mount should match anything
33 if (mount[0] == '/' && mount[1] == '\0') return &mounted_fs[i];
34
35 // compute mount_len
36 size_t mount_len = 0;
37 while (mount[mount_len]) mount_len++;
38
39 // path must be at least mount_len
40 size_t path_len = 0;
41 while (path[path_len]) path_len++;
42 if (path_len < mount_len) continue;
43
44 bool match = true;
45 for (size_t j = 0; j < mount_len; j++) {
46 if (path[j] != mount[j]) { match = false; break; }
47 }
48 if (match) return &mounted_fs[i];
49 }
50 return NULL;
51}
52
53// Adapter for VFS FS_DRIVER
54static MTSTATUS fat32_fs_init(uint8_t device_id) {
55 return fat32_init(device_id);
56}
57
59 .init = fat32_fs_init,
60 .ReadFile = fat32_read_file,
61 .WriteFile = fat32_write_file,
62 .CreateFile = fat32_create_file,
63 .DeleteObjectProcedure = fat32_deletion_routine,
64};
65
66static
67void FsDeleteObject(
68 IN void* Object
69)
70
71{
72 PFILE_OBJECT FileObject = (PFILE_OBJECT)Object;
73
74 // Get FS driver for object, if the driver has an object deletion procedure, we use, if not the object will just be deleted (no additional deletions)
75 MOUNTED_FS* fs = vfs_find_fs_for_path(FileObject->FileName);
76 if (fs && fs->driver && fs->driver->DeleteObjectProcedure) {
77 fs->driver->DeleteObjectProcedure(Object);
78 }
79}
80
82 // First initialize other FS Related stuff (FAT32, AHCI, etc..)
83 MTSTATUS status = ahci_init();
84 if (MT_FAILURE(status)) {
85 gop_printf(COLOR_RED, "AHCI | Status failure: %x", status);
86 FREEZE();
87 return status;
88 }
89 // Mount FAT32 on MAIN_FS_DEVICE
90 status = fat32_driver.init(MAIN_FS_DEVICE);
91 if (MT_FAILURE(status)) {
92 gop_printf(COLOR_RED, "FAT32 | Status failure: %x", status);
93 FREEZE();
94 return status;
95 }
96 mounted_fs[mount_count++] = (MOUNTED_FS){ .driver = &fat32_driver, .device_id = MAIN_FS_DEVICE, .mount_point = "/"};
97
98 // Create type initializer for FILE_OBJECT.
99 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
100 kmemset(&ObjectTypeInitializer, 0, sizeof(OBJECT_TYPE_INITIALIZER));
101
102 char* Name = "File";
103 ObjectTypeInitializer.PoolType = NonPagedPool;
104#ifdef DEBUG
105 ObjectTypeInitializer.DumpProcedure = NULL; // TODO DUMP PROC!
106#else
107 ObjectTypeInitializer.DumpProcedure = NULL;
108#endif
109 ObjectTypeInitializer.DeleteProcedure = &FsDeleteObject;
110 ObjectTypeInitializer.ValidAccessRights = MT_FILE_ALL_ACCESS;
111 status = ObCreateObjectType(Name, &ObjectTypeInitializer, &FsFileType);
112 if (MT_FAILURE(status)) return status;
113
114 return MT_SUCCESS;
115}
116
118 IN PFILE_OBJECT FileObject,
119 IN uint64_t FileOffset,
120 OUT void* Buffer,
121 IN size_t BufferSize,
122 _Out_Opt size_t* BytesRead
123)
124
125{
126 MOUNTED_FS* fs = vfs_find_fs_for_path(FileObject->FileName);
127 if (!fs || !fs->driver || !fs->driver->ReadFile) return MT_NOT_IMPLEMENTED;
128
129 return fs->driver->ReadFile(FileObject, FileOffset, Buffer, BufferSize, BytesRead);
130}
131
133 IN PFILE_OBJECT FileObject,
134 IN uint64_t FileOffset,
135 IN void* Buffer,
136 IN size_t BufferSize,
137 _Out_Opt size_t* BytesWritten
138)
139
140{
141 MOUNTED_FS* fs = vfs_find_fs_for_path(FileObject->FileName);
142 if (!fs || !fs->driver || !fs->driver->WriteFile) return MT_NOT_IMPLEMENTED;
143
144 return fs->driver->WriteFile(FileObject, FileOffset, Buffer, BufferSize, BytesWritten);
145}
146
148 IN PFILE_OBJECT FileObject
149)
150
151{
152 MOUNTED_FS* fs = vfs_find_fs_for_path(FileObject->FileName);
153 if (!fs || !fs->driver || !fs->driver->DeleteFile) return MT_NOT_IMPLEMENTED;
154
155 return fs->driver->DeleteFile(FileObject);
156}
157
159 IN PFILE_OBJECT DirectoryObject,
160 OUT char* listings,
161 IN size_t max_len
162)
163
164{
165 MOUNTED_FS* fs = vfs_find_fs_for_path(DirectoryObject->FileName);
166 if (!fs || !fs->driver || !fs->driver->ListDirectory) return MT_NOT_IMPLEMENTED;
167
168 return fs->driver->ListDirectory(DirectoryObject, listings, max_len);
169}
170
172 IN const char* path,
173 OUT PHANDLE OutDirectoryObject
174)
175
176{
177 MOUNTED_FS* fs = vfs_find_fs_for_path(path);
178
179 if (!fs || !fs->driver || !fs->driver->CreateDirectory) return MT_NOT_IMPLEMENTED;
180
181 PFILE_OBJECT OutDir;
182 fs->driver->CreateDirectory(path, &OutDir);
183
184 // Create a handle for the object.
185 MTSTATUS Status = ObCreateHandleForObject(OutDir, MT_FILE_ALL_ACCESS, OutDirectoryObject);
186 if (MT_FAILURE(Status)) {
187 ObDereferenceObject(OutDir);
188 }
189
190 return Status;
191}
192
194 IN PFILE_OBJECT DirectoryObject
195)
196
197{
198 MOUNTED_FS* fs = vfs_find_fs_for_path(DirectoryObject->FileName);
199 if (!fs || !fs->driver || !fs->driver->RemoveDirectoryRecursive) return MT_NOT_IMPLEMENTED;
200
201 return fs->driver->RemoveDirectoryRecursive(DirectoryObject);
202}
203
205 IN const char* path,
206 IN ACCESS_MASK DesiredAccess,
207 OUT PHANDLE FileHandleOut
208)
209
210{
211 MOUNTED_FS* fs = vfs_find_fs_for_path(path);
212 if (!fs || !fs->driver || !fs->driver->CreateFile) return MT_NOT_IMPLEMENTED;
213 PFILE_OBJECT FileObject = NULL;
214 MTSTATUS Status = fs->driver->CreateFile(path, &FileObject);
215 if (MT_FAILURE(Status)) return Status;
216
217 // File opened.
218 // Create handle.
219 Status = ObCreateHandleForObject(FileObject, DesiredAccess, FileHandleOut);
220
221 // The dereference should make the pointer count be 1 handle creation succeeded, or destroy the object if it failed.
222 ObDereferenceObject(FileObject);
223 return Status;
224}
MTSTATUS ahci_init(void)
define AHCI_DEBUG_PRINT
Definition ahci.c:292
#define _Out_Opt
Definition annotations.h:11
#define IN
Definition annotations.h:8
#define OUT
Definition annotations.h:9
uint32_t ACCESS_MASK
Definition core.h:59
int32_t * PHANDLE
Definition core.h:58
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_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
void fat32_deletion_routine(void *Object)
Definition fat32.c:2146
#define MT_FILE_ALL_ACCESS
Definition fs.h:47
struct _FILE_OBJECT * PFILE_OBJECT
void gop_printf(uint32_t color, const char *fmt,...)
Definition gop.c:633
#define FREEZE()
Definition macros.h:64
#define COLOR_RED
Colors definitions for easier access.
Definition mg.h:30
@ NonPagedPool
Definition mm.h:355
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
Definition mm.h:655
#define MT_SUCCESS
Definition mtstatus.h:22
#define MT_NOT_IMPLEMENTED
Definition mtstatus.h:23
#define MT_FAILURE(Status)
Definition mtstatus.h:16
int32_t MTSTATUS
Definition mtstatus.h:12
MTSTATUS ObCreateHandleForObject(IN void *Object, IN ACCESS_MASK DesiredAccess, OUT PHANDLE ReturnedHandle)
Definition ob.c:403
MTSTATUS ObCreateObjectType(IN char *TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, OUT POBJECT_TYPE *ReturnedObjectType)
Definition ob.c:62
void ObDereferenceObject(IN void *Object)
Definition ob.c:554
struct _OBJECT_TYPE * POBJECT_TYPE
struct _OBJECT_TYPE_INITIALIZER OBJECT_TYPE_INITIALIZER
char * FileName
Definition fs.h:101
OB_DELETE_METHOD DeleteProcedure
Definition ob.h:43
OB_DUMP_METHOD DumpProcedure
Definition ob.h:42
POOL_TYPE PoolType
Definition ob.h:39
uint32_t ValidAccessRights
Definition ob.h:41
FS_DRIVER * driver
Definition vfs.c:15
const char * mount_point
Definition vfs.c:17
uint8_t device_id
Definition vfs.c:16
#define MAX_MOUNTS
Definition vfs.c:20
MTSTATUS FsCreateDirectory(IN const char *path, OUT PHANDLE OutDirectoryObject)
Definition vfs.c:171
POBJECT_TYPE FsFileType
Definition vfs.c:26
#define MAIN_FS_DEVICE
Definition vfs.c:24
MTSTATUS FsReadFile(IN PFILE_OBJECT FileObject, IN uint64_t FileOffset, OUT void *Buffer, IN size_t BufferSize, _Out_Opt size_t *BytesRead)
Definition vfs.c:117
MTSTATUS FsInitialize(void)
Definition vfs.c:81
MTSTATUS FsCreateFile(IN const char *path, IN ACCESS_MASK DesiredAccess, OUT PHANDLE FileHandleOut)
Definition vfs.c:204
MTSTATUS FsListDirectory(IN PFILE_OBJECT DirectoryObject, OUT char *listings, IN size_t max_len)
Definition vfs.c:158
MTSTATUS FsWriteFile(IN PFILE_OBJECT FileObject, IN uint64_t FileOffset, IN void *Buffer, IN size_t BufferSize, _Out_Opt size_t *BytesWritten)
Definition vfs.c:132
MTSTATUS FsDeleteFile(IN PFILE_OBJECT FileObject)
Definition vfs.c:147
FS_DRIVER fat32_driver
Definition vfs.c:58
MTSTATUS FsRemoveDirectoryRecursive(IN PFILE_OBJECT DirectoryObject)
Definition vfs.c:193