:: commit f59f18458c0c990665008b6ac996ee54082b5366

Itay Almog <itay2828@gmail.com> — 2021-09-03 08:03

parents: 34cfd0e55b

Starting to work on NTFS

diff --git a/stage23/fs/file.s2.c b/stage23/fs/file.s2.c
index a90e9fcb..88d678d7 100644
--- a/stage23/fs/file.s2.c
+++ b/stage23/fs/file.s2.c
@@ -5,6 +5,7 @@
 #include <fs/ext2.h>
 #include <fs/fat32.h>
 #include <fs/iso9660.h>
+#include <fs/ntfs.h>
 #include <lib/print.h>
 #include <lib/blib.h>
 #include <mm/pmm.h>
@@ -97,6 +98,20 @@ int fopen(struct file_handle *ret, struct volume *part, const char *filename) {
         return 0;
     }
 
+    if (ntfs_check_signature(part)) {
+        struct ntfs_file_handle *fd = ext_mem_alloc(sizeof(struct ntfs_file_handle));
+
+        int r = ntfs_open(fd, part, filename);
+        if (r)
+            return r;
+
+        ret->fd = (void *)fd;
+        ret->read = (void *)ntfs_read;
+        ret->size = fd->size_bytes;
+
+        return 0;
+    }
+
     return -1;
 }
 
diff --git a/stage23/fs/ntfs.h b/stage23/fs/ntfs.h
new file mode 100644
index 00000000..81fe5270
--- /dev/null
+++ b/stage23/fs/ntfs.h
@@ -0,0 +1,20 @@
+#ifndef __FS__NTFS_H__
+#define __FS__NTFS_H__
+
+#include <stdint.h>
+#include <stddef.h>
+#include <stdbool.h>
+#include <lib/part.h>
+#include <lib/blib.h>
+
+struct ntfs_file_handle {
+    struct volume *part;
+    uint32_t size_bytes;
+};
+
+int ntfs_check_signature(struct volume *part);
+
+int ntfs_open(struct ntfs_file_handle *ret, struct volume *part, const char *path);
+int ntfs_read(struct ntfs_file_handle *file, void *buf, uint64_t loc, uint64_t count);
+
+#endif
\ No newline at end of file
diff --git a/stage23/fs/ntfs.s2.c b/stage23/fs/ntfs.s2.c
new file mode 100644
index 00000000..4ce71f28
--- /dev/null
+++ b/stage23/fs/ntfs.s2.c
@@ -0,0 +1,61 @@
+#include <fs/ntfs.h>
+
+struct ntfs_bpb {
+    uint8_t jump[3];
+    char oem[8];
+    uint16_t bytes_per_sector;
+    uint8_t sectors_per_cluster;
+    uint16_t reserved_sectors;
+    uint8_t fats_count;
+    uint16_t directory_entries_count;
+    uint16_t sector_totals;
+    uint8_t media_descriptor_type;
+    uint16_t sectors_per_fat_16;
+    uint16_t sectors_per_track;
+    uint16_t heads_count;
+    uint32_t hidden_sectors_count;
+    uint32_t large_sectors_count;
+    
+    // ntfs 
+    uint32_t sectors_per_fat_32;
+    uint64_t sectors_count_64;
+    uint64_t mft_cluster;
+} __attribute__((packed));
+
+int ntfs_check_signature(struct volume *part) {
+    struct ntfs_bpb bpb = { 0 };
+    if (volume_read(part, &bpb, 0, sizeof(bpb))) {
+        return 1;
+    }
+
+    //
+    // validate the bpb
+    //
+
+    if (strncmp(bpb.oem, "NTFS    ", SIZEOF_ARRAY(bpb.oem))) {
+        return 1;
+    }
+
+    if (bpb.sector_totals != 0) {
+        return 1;
+    }
+
+    if (bpb.large_sectors_count != 0) {
+        return 1;
+    }
+
+    if (bpb.sectors_count_64 == 0) {
+        return 1;
+    }
+
+    // this is a valid ntfs sector
+    return 0;
+}
+
+int ntfs_open(struct ntfs_file_handle *ret, struct volume *part, const char *path) {
+
+}
+
+int ntfs_read(struct ntfs_file_handle *file, void *buf, uint64_t loc, uint64_t count) {
+
+}
tab: 248 wrap: offon