NeKernel dev
Loading...
Searching...
No Matches
HeFS.h
Go to the documentation of this file.
1/* -------------------------------------------
2
3 Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved.
4
5------------------------------------------- */
6
7#pragma once
8
10#include <KernelKit/DriveMgr.h>
11#include <KernelKit/UserMgr.h>
12#include <NeKit/Crc32.h>
13#include <NeKit/Defines.h>
14#include <NeKit/KString.h>
15#include <hint/CompilerHint.h>
16
19
20#define kHeFSVersion (0x0103)
21#define kHeFSMagic " HeFS"
22#define kHeFSMagicLen (8)
23
24#define kHeFSBlockLen (512U)
25#define kHeFSFileNameLen (256U)
26#define kHeFSPartNameLen (128U)
27
28#define kHeFSMinimumDiskSize (gib_cast(128))
29
30#define kHeFSDefaultVolumeName u8"HeFS Volume"
31
32#define kHeFSINDStartOffset (sizeof(HEFS_BOOT_NODE))
33#define kHeFSINStartOffset (sizeof(HEFS_INDEX_NODE_DIRECTORY))
34
35#define kHeFSSearchAllStr u8"*"
36
37struct HEFS_BOOT_NODE;
38struct HEFS_INDEX_NODE;
41
42enum : UInt8 {
43 kHeFSHardDrive = 0xC0, // Hard Drive
44 kHeFSSolidStateDrive = 0xC1, // Solid State Drive
45 kHeFSOpticalDrive = 0x0C, // Blu-Ray/DVD
47 kHeFSScsiDrive = 0xC4, // SCSI Hard Drive
49 kHeFSUnknown = 0xFF, // Unknown device.
51};
52
53enum : UInt8 {
59};
60
61enum : UInt16 {
80};
81
82inline constexpr UInt16 kHeFSFileKindRegular = 0x00;
83inline constexpr UInt16 kHeFSFileKindDirectory = 0x01;
84inline constexpr UInt16 kHeFSFileKindBlock = 0x02;
85inline constexpr UInt16 kHeFSFileKindCharacter = 0x03;
86inline constexpr UInt16 kHeFSFileKindFIFO = 0x04;
87inline constexpr UInt16 kHeFSFileKindSocket = 0x05;
88inline constexpr UInt16 kHeFSFileKindSymbolicLink = 0x06;
89inline constexpr UInt16 kHeFSFileKindUnknown = 0x07;
90inline constexpr UInt16 kHeFSFileKindCount = 0x08;
91
95inline constexpr UInt16 kHeFSSliceCount = 0x10;
96
97inline constexpr UInt16 kHeFSInvalidVID = 0xFFFF;
98
99namespace Kernel {
102typedef UInt64 ATime;
103
133
134inline constexpr ATime kHeFSTimeInvalid = 0x0000000000000000;
135inline constexpr ATime kHeFSTimeMax = 0xFFFFFFFFFFFFFFFF - 1;
136
149
160
187
188enum {
190 kHeFSRed = 100,
193};
194
222} // namespace Kernel
223
224namespace Kernel::Detail {
229inline UInt32 hefs_year_get(ATime raw_atime) noexcept {
230 return (raw_atime) >> 32;
231}
232
237inline UInt32 hefs_month_get(ATime raw_atime) noexcept {
238 return (raw_atime) >> 24;
239}
240
245inline UInt32 hefs_day_get(ATime raw_atime) noexcept {
246 return (raw_atime) >> 16;
247}
248
253inline UInt32 hefs_hour_get(ATime raw_atime) noexcept {
254 return (raw_atime) >> 8;
255}
256
261inline UInt32 hefs_minute_get(ATime raw_atime) noexcept {
262 return (raw_atime) &0xFF;
263}
264
265inline constexpr UInt32 kHeFSBaseYear = 1970;
266inline constexpr UInt32 kHeFSBaseMonth = 1;
267inline constexpr UInt32 kHeFSBaseDay = 1;
268inline constexpr UInt32 kHeFSBaseHour = 0;
269inline constexpr UInt32 kHeFSBaseMinute = 0;
270
271inline const Char* hefs_status_to_string(UInt16 status) noexcept {
272 switch (status) {
274 return "Unlocked";
276 return "Locked";
277 case kHeFSStatusError:
278 return "Error";
280 return "Invalid";
281 default:
282 return "Unknown";
283 }
284}
285
286inline const Char* hefs_drive_kind_to_string(UInt8 kind) noexcept {
287 switch (kind) {
288 case kHeFSHardDrive:
289 return "Hard Drive";
291 return "Solid State Drive";
293 return "Optical Drive";
295 return "Mass Storage Device";
296 case kHeFSScsiDrive:
297 return "SCSI/SAS Drive";
298 case kHeFSFlashDrive:
299 return "Flash Drive";
300 case kHeFSUnknown:
301 default:
302 return "Unknown";
303 }
304}
305
306inline const Char* hefs_encoding_to_string(UInt8 encoding) noexcept {
307 switch (encoding) {
309 return "UTF-8";
311 return "UTF-16";
313 return "UTF-32";
315 return "UTF-16BE";
317 return "UTF-16LE";
319 return "UTF-32BE";
321 return "UTF-32LE";
323 return "UTF-8BE";
325 return "UTF-8LE";
326 default:
327 return "Unknown";
328 }
329}
330
331inline const Char* hefs_file_kind_to_string(UInt16 kind) noexcept {
332 switch (kind) {
334 return "Regular File";
336 return "Directory";
338 return "Block Device";
340 return "Character Device";
342 return "FIFO";
344 return "Socket";
346 return "Symbolic Link";
348 default:
349 return "Unknown";
350 }
351}
352
353inline const Char* hefs_file_flags_to_string(UInt32 flags) noexcept {
354 switch (flags) {
355 case kHeFSFlagsNone:
356 return "No Flags";
358 return "Read Only";
359 case kHeFSFlagsHidden:
360 return "Hidden";
361 case kHeFSFlagsSystem:
362 return "System";
364 return "Archive";
365 case kHeFSFlagsDevice:
366 return "Device";
367 default:
368 return "Unknown";
369 }
370}
371} // namespace Kernel::Detail
372
373namespace Kernel {
377 public:
380
381 public:
384
387
388 public:
393 const Utf8Char* part_name);
394
396 const Utf8Char* dir);
397
399 const Utf8Char* dir);
400
401 _Output Bool CreateINode(_Input DriveTrait* drive, _Input const Int32 flags, const Utf8Char* dir,
402 const Utf8Char* name, const UInt8 kind);
403
404 _Output Bool DeleteINode(_Input DriveTrait* drive, _Input const Int32 flags, const Utf8Char* dir,
405 const Utf8Char* name, const UInt8 kind);
406
408 const Utf8Char* dir, const Utf8Char* name, const UInt8 kind,
409 const BOOL input);
410
411 private:
413 const Utf8Char* dir, const Utf8Char* name, const BOOL delete_or_create,
414 const UInt8 kind);
415
417 const Utf8Char* dir, const BOOL delete_or_create);
418};
419
420namespace HeFS {
421
425} // namespace HeFS
426} // namespace Kernel
#define _Output
Definition CompilerHint.h:15
#define _Input
Definition CompilerHint.h:14
Drive Manager.
#define PACKED
_Output Bool CreateINode(_Input DriveTrait *drive, _Input const Int32 flags, const Utf8Char *dir, const Utf8Char *name, const UInt8 kind)
_Output Bool INodeDirectoryCtlManip(_Input DriveTrait *drive, _Input const Int32 flags, const Utf8Char *dir, const BOOL delete_or_create)
_Output Bool INodeManip(_Input DriveTrait *drive, VoidPtr block, SizeT block_sz, const Utf8Char *dir, const Utf8Char *name, const UInt8 kind, const BOOL input)
HeFileSystemParser & operator=(const HeFileSystemParser &)=delete
_Output Bool Format(_Input _Output DriveTrait *drive, _Input const Int32 flags, const Utf8Char *part_name)
Make a EPM+HeFS drive out of the disk.
_Output Bool RemoveINodeDirectory(_Input DriveTrait *drive, _Input const Int32 flags, const Utf8Char *dir)
_Output Bool CreateINodeDirectory(_Input DriveTrait *drive, _Input const Int32 flags, const Utf8Char *dir)
_Output Bool INodeCtlManip(_Input DriveTrait *drive, _Input const Int32 flags, const Utf8Char *dir, const Utf8Char *name, const BOOL delete_or_create, const UInt8 kind)
HeFileSystemParser & operator=(HeFileSystemParser &&)=delete
_Output Bool DeleteINode(_Input DriveTrait *drive, _Input const Int32 flags, const Utf8Char *dir, const Utf8Char *name, const UInt8 kind)
HeFileSystemParser(HeFileSystemParser &&)=delete
HeFileSystemParser(const HeFileSystemParser &)=delete
#define BOOL
Definition macros.h:25
#define kHeFSMagicLen
Definition HeFS.h:22
@ kHeFSSolidStateDrive
Definition HeFS.h:44
@ kHeFSHardDrive
Definition HeFS.h:43
@ kHeFSUnknown
Definition HeFS.h:49
@ kHeFSFlashDrive
Definition HeFS.h:48
@ kHeFSOpticalDrive
Definition HeFS.h:45
@ kHeFSScsiDrive
Definition HeFS.h:47
@ kHeFSDriveCount
Definition HeFS.h:50
@ kHeFSMassStorageDevice
Definition HeFS.h:46
constexpr UInt16 kHeFSFileKindRegular
Definition HeFS.h:82
@ kHeFSEncodingFlagsUTF16BE
Definition HeFS.h:65
@ kHeFSFlagsDevice
Definition HeFS.h:78
@ kHeFSFlagsCount
Definition HeFS.h:79
@ kHeFSEncodingFlagsCount
Definition HeFS.h:72
@ kHeFSEncodingFlagsUTF32BE
Definition HeFS.h:67
@ kHeFSEncodingFlagsUTF8LE
Definition HeFS.h:70
@ kHeFSEncodingFlagsUTF8
Definition HeFS.h:62
@ kHeFSFlagsArchive
Definition HeFS.h:77
@ kHeFSFlagsReadOnly
Definition HeFS.h:74
@ kHeFSEncodingFlagsUTF8BE
Definition HeFS.h:69
@ kHeFSFlagsSystem
Definition HeFS.h:76
@ kHeFSFlagsHidden
Definition HeFS.h:75
@ kHeFSEncodingFlagsUTF16
Definition HeFS.h:63
@ kHeFSEncodingFlagsUTF16LE
Definition HeFS.h:66
@ kHeFSFlagsNone
Definition HeFS.h:73
@ kHeFSEncodingFlagsUTF32LE
Definition HeFS.h:68
@ kHeFSEncodingFlagsBinary
Definition HeFS.h:71
@ kHeFSEncodingFlagsUTF32
Definition HeFS.h:64
constexpr UInt16 kHeFSInvalidVID
Definition HeFS.h:97
constexpr UInt16 kHeFSFileKindSocket
Definition HeFS.h:87
constexpr UInt16 kHeFSFileKindDirectory
Definition HeFS.h:83
constexpr UInt16 kHeFSFileKindBlock
Definition HeFS.h:84
@ kHeFSStatusCount
Definition HeFS.h:58
@ kHeFSStatusInvalid
Definition HeFS.h:57
@ kHeFSStatusUnlocked
Definition HeFS.h:54
@ kHeFSStatusLocked
Definition HeFS.h:55
@ kHeFSStatusError
Definition HeFS.h:56
#define kHeFSPartNameLen
Definition HeFS.h:26
constexpr UInt16 kHeFSFileKindUnknown
Definition HeFS.h:89
constexpr UInt16 kHeFSFileKindFIFO
Definition HeFS.h:86
constexpr UInt16 kHeFSFileKindSymbolicLink
Definition HeFS.h:88
constexpr UInt16 kHeFSSliceCount
HeFS blocks are array containing sparse blocks of data.
Definition HeFS.h:95
constexpr UInt16 kHeFSFileKindCharacter
Definition HeFS.h:85
constexpr UInt16 kHeFSFileKindCount
Definition HeFS.h:90
Implementation details namespace.
Definition HeFS.h:224
const Char * hefs_drive_kind_to_string(UInt8 kind) noexcept
Definition HeFS.h:286
UInt32 hefs_month_get(ATime raw_atime) noexcept
HeFS get month from ATime.
Definition HeFS.h:237
constexpr UInt32 kHeFSBaseHour
Definition HeFS.h:268
const Char * hefs_status_to_string(UInt16 status) noexcept
Definition HeFS.h:271
UInt32 hefs_hour_get(ATime raw_atime) noexcept
HeFS get hour from ATime.
Definition HeFS.h:253
UInt32 hefs_year_get(ATime raw_atime) noexcept
HeFS get year from ATime.
Definition HeFS.h:229
constexpr UInt32 kHeFSBaseYear
Definition HeFS.h:265
UInt32 hefs_minute_get(ATime raw_atime) noexcept
HeFS get minute from ATime.
Definition HeFS.h:261
UInt32 hefs_day_get(ATime raw_atime) noexcept
HeFS get day from ATime.
Definition HeFS.h:245
constexpr UInt32 kHeFSBaseDay
Definition HeFS.h:267
const Char * hefs_encoding_to_string(UInt8 encoding) noexcept
Definition HeFS.h:306
const Char * hefs_file_kind_to_string(UInt16 kind) noexcept
Definition HeFS.h:331
constexpr UInt32 kHeFSBaseMonth
Definition HeFS.h:266
const Char * hefs_file_flags_to_string(UInt32 flags) noexcept
Definition HeFS.h:353
constexpr UInt32 kHeFSBaseMinute
Definition HeFS.h:269
Definition HeFS.h:420
Boolean fs_init_hefs(Void) noexcept
Initialize HeFS inside the main disk.
USER_PROCESS inline definitions.
Definition Qr.h:793
char Char
Definition Defines.h:51
void Void
Definition Defines.h:85
UInt64 ATime
Access time type.
Definition HeFS.h:102
constexpr ATime kHeFSTimeMax
Definition HeFS.h:135
int Int32
Definition Defines.h:38
unsigned char UInt8
Definition Defines.h:53
UInt64 Lba
Definition Defines.h:87
__SIZE_TYPE__ SizeT
Definition Defines.h:58
unsigned int UInt32
Definition Defines.h:44
constexpr ATime kHeFSTimeInvalid
Definition HeFS.h:134
void * VoidPtr
Definition Defines.h:33
HeFSJournalKind
This enum defines the opcode of the journal, here mentioned as 'kinds'.
Definition HeFS.h:151
@ kJournalKindInvalid
Definition HeFS.h:152
@ kJournalKindFlagEdit
Definition HeFS.h:156
@ kJournalKindCreate
Definition HeFS.h:157
@ kJournalKindWrite
Definition HeFS.h:153
@ kJournalKindRename
Definition HeFS.h:154
@ kJournalKindCount
Definition HeFS.h:158
@ kJournalKindDelete
Definition HeFS.h:155
char8_t Utf8Char
Definition Defines.h:73
unsigned short UInt16
Definition Defines.h:40
bool Boolean
Definition Defines.h:49
@ kHeFSBlack
Definition HeFS.h:191
@ kHeFSRed
Definition HeFS.h:190
@ kHeFSColorCount
Definition HeFS.h:192
@ kHeFSInvalidColor
Definition HeFS.h:189
__UINT64_TYPE__ UInt64
Definition Defines.h:48
bool Bool
Definition Defines.h:50
Media drive trait type.
Definition DriveMgr.h:54
HeFS Boot node.
Definition HeFS.h:107
UInt64 fEndBlock
Start Blocks range.
Definition HeFS.h:129
UInt32 fVersion
Volume name.
Definition HeFS.h:110
UInt8 fEncoding
Kind of the drive. (Hard Drive, Solid State Drive, Optical Drive, etc).
Definition HeFS.h:117
Char fMagic[kHeFSMagicLen]
Definition HeFS.h:108
UInt64 fStartIND
Encoding of the filesystem. (UTF-8, UTF-16, etc).
Definition HeFS.h:118
UInt64 fStartIN
Virtual Identification Number within an EPM disk. (0xFFFF if not used).
Definition HeFS.h:126
UInt16 fVID
Flags of the disk. (read-only, read-write, etc).
Definition HeFS.h:125
Utf8Char fVolName[kHeFSPartNameLen]
Magic number of the filesystem.
Definition HeFS.h:109
Char fPad[264]
Boot Node's COW journal LBA.
Definition HeFS.h:131
UInt64 fSectorSize
Number of sectors in the filesystem.
Definition HeFS.h:113
UInt32 fChecksum
Size of the sector.
Definition HeFS.h:114
UInt16 fDiskStatus
Size of the disk. (Could be a virtual size, that is not the real size of the disk....
Definition HeFS.h:123
UInt64 fJournalLBA
End Blocks range.
Definition HeFS.h:130
UInt64 fSectorCount
Number of bad sectors in the filesystem.
Definition HeFS.h:112
UInt64 fINDCount
End of the INode directory tree.
Definition HeFS.h:120
UInt64 fEndIN
Start INodes range.
Definition HeFS.h:127
UInt64 fBadSectors
Version of the filesystem.
Definition HeFS.h:111
UInt16 fDiskFlags
Status of the disk. (locked, unlocked, error, invalid).
Definition HeFS.h:124
UInt64 fDiskSize
Number of leafs in the INode tree.
Definition HeFS.h:121
UInt64 fEndIND
Start of the INode directory tree.
Definition HeFS.h:119
UInt64 fStartBlock
End INodes range.
Definition HeFS.h:128
UInt8 fDiskKind
Checksum of the boot node.
Definition HeFS.h:115
HeFS directory node.
Definition HeFS.h:198
Lba fNext
Color of the node. (Red or Black).
Definition HeFS.h:218
UInt8 fColor
Start of the index node.
Definition HeFS.h:217
UInt32 fEntryCount
Definition HeFS.h:203
UInt32 fMode
User ID and Group ID of the file.
Definition HeFS.h:209
UInt16 fReserved
File flags.
Definition HeFS.h:202
Lba fParent
Definition HeFS.h:218
ATime fModified
Definition HeFS.h:206
ATime fAccessed
Definition HeFS.h:206
UInt32 fFlags
Directory path as FNV hash.
Definition HeFS.h:201
Char fPad[285]
Red-black tree pointers.
Definition HeFS.h:220
ATime fCreated
Checksum of the file, index node checksum.
Definition HeFS.h:206
UInt64 fHashPath
Definition HeFS.h:199
UInt32 fChecksum
Entry Count of this directory inode.
Definition HeFS.h:204
Lba fChild
Definition HeFS.h:218
Lba fPrev
Definition HeFS.h:218
ATime fDeleted
Definition HeFS.h:207
UInt64 fINSlices[kHeFSSliceCount]
File mode. (read, write, execute, etc).
Definition HeFS.h:215
UInt32 fGID
Definition HeFS.h:208
UInt32 fUID
File timestamps and allocation status.
Definition HeFS.h:208
HeFS index node.
Definition HeFS.h:165
UInt32 fChecksum
File size.
Definition HeFS.h:171
ATime fModified
Definition HeFS.h:176
UInt32 fUID
File timestamps.
Definition HeFS.h:177
UInt32 fOffsetSliceHigh
Definition HeFS.h:183
UInt32 fGID
Definition HeFS.h:177
ATime fCreated
Is this a symbolic link? (if yes, the fName is the path to the file and blocklinkstart and end contai...
Definition HeFS.h:176
ATime fAccessed
Definition HeFS.h:176
Boolean fSymLink
Checksum.
Definition HeFS.h:173
UInt32 fOffsetSliceLow
File mode. (read, write, execute, etc).
Definition HeFS.h:182
UInt32 fSize
File kind. (Regular, Directory, Block, Character, FIFO, Socket, Symbolic Link, Unknown).
Definition HeFS.h:170
ATime fDeleted
Definition HeFS.h:176
UInt32 fFlags
File name.
Definition HeFS.h:167
UInt64 fHashPath
Definition HeFS.h:166
UInt32 fMode
User ID and Group ID of the file.
Definition HeFS.h:178
UInt16 fKind
File flags.
Definition HeFS.h:168
Char fPad[437]
Definition HeFS.h:185
Journal Node structure.
Definition HeFS.h:142
UInt64 fStatus
Definition HeFS.h:144
UInt64 fHashPath
Definition HeFS.h:143
UInt8 fPad[487]
Definition HeFS.h:147
UInt64 fCopyElem
Definition HeFS.h:145
UInt8 fCopyKind
Definition HeFS.h:146