blob: 4b4dec06319ec33468a58408de9a36e3ddbbe072 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
#ifndef EXT2_H
#define EXT2_H
#include <drivers/ata.h>
#include <fs/vfs.h>
#include <kmalloc.h>
#include <stdint.h>
typedef struct Superblock {
uint32_t num_inodes;
uint32_t num_blocks;
uint32_t num_blocks_reserved;
uint32_t num_blocks_unallocated;
uint32_t num_inodes_unallocated;
uint32_t superblock_block_num;
uint32_t block_size;
uint32_t fragment_size;
uint32_t num_blocks_in_group;
uint32_t num_fragments_in_group;
uint32_t num_inodes_in_group;
uint32_t last_mount;
uint32_t last_write;
uint16_t num_mounts_since_fsck;
uint16_t num_mounts_allowed;
uint16_t ext2_signature; // 0xEF53
uint16_t fs_state;
uint16_t when_error;
uint16_t minor_version;
uint32_t last_fsck;
uint32_t interval_fsck;
uint32_t os_id;
uint32_t major_version;
uint16_t userid_reserved_blocks;
uint16_t groupid_reserved_blocks;
} __attribute__((packed)) superblock_t;
typedef struct ExtendedSuperblock {
uint32_t num_inodes;
uint32_t num_blocks;
uint32_t num_blocks_reserved;
uint32_t num_blocks_unallocated;
uint32_t num_inodes_unallocated;
uint32_t superblock_block_num;
uint32_t block_size;
uint32_t fragment_size;
uint32_t num_blocks_group;
uint32_t num_fragments_group;
uint32_t num_inodes_group;
uint32_t last_mount;
uint32_t last_write;
uint16_t num_mounts_since_fsck;
uint16_t num_mounts_allowed;
uint16_t ext2_signature; // 0xEF53
uint16_t fs_state;
uint16_t when_error;
uint16_t minor_version;
uint32_t last_fsck;
uint32_t interval_fsck;
uint32_t os_id;
uint32_t major_version;
uint16_t userid_reserved_blocks;
uint16_t groupid_reserved_blocks;
uint32_t pad;
uint16_t inode_size;
} __attribute__((packed)) ext_superblock_t;
typedef struct BlockGroupDescriptorTable {
uint32_t block_usage_bitmap;
uint32_t inode_usage_bitmap;
uint32_t starting_inode_table;
uint16_t num_unallocated_blocks_in_group;
uint16_t num_unallocated_inodes_in_group;
uint16_t num_directories_group;
} __attribute__((packed)) bgdt_t;
typedef struct INode {
uint16_t types_permissions;
uint16_t user_id;
uint32_t low_32size;
uint32_t last_access_time;
uint32_t creation_time;
uint32_t last_modification_time;
uint32_t deletion_time;
uint16_t group_id;
uint16_t num_hard_links;
uint32_t num_disk_sectors;
uint32_t flags;
uint32_t os_specific;
uint32_t block_pointers[12];
uint32_t single_indirect_block_pointer;
uint32_t double_indirect_block_pointer;
uint32_t triple_indirect_block_pointer;
uint32_t gen_number;
uint32_t _extended_attribute_block;
uint32_t _upper_32size;
uint32_t address_fragment;
uint32_t os_specific2;
} __attribute__((packed)) inode_t;
// 0 Unknown type
// 1 Regular file
// 2 Directory
// 3 Character device
// 4 Block device
// 5 FIFO
// 6 Socket
// 7 Symbolic link (soft link)
#define TYPE_INDICATOR_UNKOWN 0
#define TYPE_INDICATOR_REGULAR 1
#define TYPE_INDICATOR_DIRECTORY 2
#define TYPE_INDICATOR_CHARACTER_DEVICE 3
#define TYPE_INDICATOR_BLOCK_DEVICE 4
#define TYPE_INDICATOR_FIFO 5
#define TYPE_INDICATOR_SOCKET 6
#define TYPE_INDICATOR_SOFT_LINK 7
#define FIFO 0x1000
#define CHARACTER_DEVICE 0x2000
#define DIRECTORY 0x4000
#define BLOCK_DEVICE 0x6000
#define REGULAR_FILE 0x8000
#define SYMBOLIC_LINK 0xA000
#define UNIX_SOCKET 0xC000
typedef struct DirectoryEntryHeader {
uint32_t inode;
uint16_t size;
uint8_t name_length;
uint8_t type_indicator;
} __attribute__((packed)) direntry_header_t;
int ext2_create_file(const char *path, int mode);
vfs_inode_t *ext2_mount(void);
void parse_superblock(void);
size_t ext2_read_file_offset(const char *file, char *data, uint64_t size,
uint64_t offset, uint64_t *file_size);
size_t ext2_read_file(const char *file, char *data, size_t size,
uint64_t *file_size);
int ext2_create_directory(const char *path, int mode);
#endif
|