From f3d931aa7cfaf96baef8383b59a8938779541ee7 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Thu, 15 Aug 2024 18:35:34 +0200 Subject: [IMP] Moved source code into dev/ folder. Signed-off-by: Amlal EL Mahrouss --- dev/Kernel/FSKit/Defines.hxx | 11 ++ dev/Kernel/FSKit/FAT32.hxx | 12 ++ dev/Kernel/FSKit/IndexableProperty.hxx | 63 +++++++ dev/Kernel/FSKit/NewFS.hxx | 323 +++++++++++++++++++++++++++++++++ 4 files changed, 409 insertions(+) create mode 100644 dev/Kernel/FSKit/Defines.hxx create mode 100644 dev/Kernel/FSKit/FAT32.hxx create mode 100644 dev/Kernel/FSKit/IndexableProperty.hxx create mode 100644 dev/Kernel/FSKit/NewFS.hxx (limited to 'dev/Kernel/FSKit') diff --git a/dev/Kernel/FSKit/Defines.hxx b/dev/Kernel/FSKit/Defines.hxx new file mode 100644 index 00000000..de33dd3a --- /dev/null +++ b/dev/Kernel/FSKit/Defines.hxx @@ -0,0 +1,11 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + +------------------------------------------- */ + +#pragma once + +#include + +#define FSKIT_VERSION "1.00" diff --git a/dev/Kernel/FSKit/FAT32.hxx b/dev/Kernel/FSKit/FAT32.hxx new file mode 100644 index 00000000..04fa0c6d --- /dev/null +++ b/dev/Kernel/FSKit/FAT32.hxx @@ -0,0 +1,12 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + +------------------------------------------- */ + +#pragma once + +#include + +/// @file FAT32.hxx +/// @brief FAT32 support. \ No newline at end of file diff --git a/dev/Kernel/FSKit/IndexableProperty.hxx b/dev/Kernel/FSKit/IndexableProperty.hxx new file mode 100644 index 00000000..89d90ddc --- /dev/null +++ b/dev/Kernel/FSKit/IndexableProperty.hxx @@ -0,0 +1,63 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include + +#define kIndexerNodeNameLength 255 +#define kIndexerClaimed 0xCF + +namespace Kernel +{ + namespace Indexer + { + struct IndexProperty final + { + public: + Char Drive[kDriveNameLen]; + Char Path[kIndexerNodeNameLength]; + }; + + class IndexableProperty final : public Property + { + public: + explicit IndexableProperty() + : Property() + { + Kernel::StringView strProp(cMaxPropLen); + strProp += "\\Properties\\Indexable"; + + this->GetKey() = strProp; + } + + ~IndexableProperty() override = default; + + NEWOS_COPY_DEFAULT(IndexableProperty); + + public: + IndexProperty& Leak() noexcept; + + public: + void AddFlag(Int16 flag); + void RemoveFlag(Int16 flag); + Int16 HasFlag(Int16 flag); + + private: + IndexProperty fIndex; + UInt32 fFlags; + }; + + /// @brief Index a file into the indexer instance. + /// @param filename path + /// @param filenameLen used bytes in path. + /// @param indexer the filesystem indexer. + /// @return none. + Void fs_index_file(const Char* filename, SizeT filenameLen, IndexableProperty& indexer); + } // namespace Indexer +} // namespace Kernel diff --git a/dev/Kernel/FSKit/NewFS.hxx b/dev/Kernel/FSKit/NewFS.hxx new file mode 100644 index 00000000..54b11e38 --- /dev/null +++ b/dev/Kernel/FSKit/NewFS.hxx @@ -0,0 +1,323 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies. + + File: NewFS.hxx + Purpose: + + Revision History: + + ?/?/?: Added file (amlel) + 12/02/24: Add UUID macro for EPM and GPT partition schemes. + 3/16/24: Add mandatory sector size, kNewFSSectorSz is set to 2048 by +default. + +------------------------------------------- */ + +#pragma once + +#include +#include +#include +#include + +/** + @brief New File System specification. + @author Amlal EL Mahrouss +*/ + +#define kNewFSInvalidFork (-1) +#define kNewFSInvalidCatalog (-1) +#define kNewFSNodeNameLen (256) + +#define kNewFSSectorSz (512) + +#define kNewFSIdentLen (8) +#define kNewFSIdent " NewFS" +#define kNewFSPadLen (400) + +#define kNewFSMetaFilePrefix '$' + +#define kNewFSVersionInteger (0x0127) +#define kNewFSVerionString "1.27" + +/// @brief Standard fork types. +#define kNewFSDataFork "main_data" +#define kNewFSResourceFork "main_rsrc" + +#define kNewFSCatalogKindFile (1) +#define kNewFSCatalogKindDir (2) +#define kNewFSCatalogKindAlias (3) + +#define kNewFSForkSize (8192) + +//! shared between network or +//! other filesystems. Export forks as .zip when copying. +#define kNewFSCatalogKindShared (4) + +#define kNewFSCatalogKindResource (5) +#define kNewFSCatalogKindExecutable (6) + +#define kNewFSCatalogKindPage (8) + +#define kNewFSPartitionTypeStandard (7) +#define kNewFSPartitionTypePage (8) +#define kNewFSPartitionTypeBoot (9) + +#define kNewFSCatalogKindDevice (9) +#define kNewFSCatalogKindLock (10) + +#define kNewFSCatalogKindRLE (11) + +#define kNewFSCatalogKindMetaFile (12) + +#define kNewFSSeparator '\\' +#define kNewFSSeparatorAlt '/' + +#define kNewFSUpDir ".." +#define kNewFSRoot "\\" +#define kNewFSRootAlt "/" + +#define kNewFSLF '\r' +#define kNewFSEOF (-1) + +#define kNewFSBitWidth (sizeof(Kernel::Char)) +#define kNewFSLbaType (Kernel::Lba) + +/// Start After the PM headers, pad 1024 bytes. +#define kNewFSStartLba (1024) +#define kNewFSCatalogStartAddress ((2048) + sizeof(NFS_ROOT_PARTITION_BLOCK) + sizeof(NFS_CATALOG_STRUCT)) + +#define kResourceTypeDialog (10) +#define kResourceTypeString (11) +#define kResourceTypeMenu (12) + +#define kConfigLen (64) +#define kPartLen (32) + +#define kNewFSFlagDeleted (70) +#define kNewFSFlagUnallocated (0) +#define kNewFSFlagCreated (71) + +#define kNewFSMimeNameLen (200) + +#define kNewFSForkNameLen (200U) + +struct NFS_CATALOG_STRUCT; +struct NFS_FORK_STRUCT; +struct NFS_ROOT_PARTITION_BLOCK; + +enum +{ + kNewFSHardDrive = 0xC0, // Hard Drive + kNewFSSolidStateDrive = 0xC1, // Solid State Drive + kNewFSOpticalDrive = 0x0C, // Blu-Ray/DVD + kNewFSMassStorageDevice = 0xCC, // USB + kNewFSScsi = 0xC4, // SCSI Hard Drive + kNewFSFlashDrive = 0xC6, + kNewFSUnknown = 0xFF, // Unknown device. + kNewFSDriveCount = 7, +}; + +/// @brief Catalog type. +struct PACKED NFS_CATALOG_STRUCT final +{ + Kernel::Char Name[kNewFSNodeNameLen]; + Kernel::Char Mime[kNewFSMimeNameLen]; + + /// Catalog status flag. + Kernel::UInt16 Flags; + /// Custom catalog flags. + Kernel::UInt16 FileFlags; + /// Catalog kind. + Kernel::Int32 Kind; + + /// Size of the data fork. + Kernel::Lba DataForkSize; + + /// Size of all resource forks. + Kernel::Lba ResourceForkSize; + + Kernel::Lba DataFork; + Kernel::Lba ResourceFork; + + Kernel::Lba NextSibling; + Kernel::Lba PrevSibling; +}; + +/// @brief Fork type, contains a data page. +/// @note The way we store is way different than how other filesystems do, specific chunk of code are +/// written into either the data fork or resource fork, the resource fork is reserved for file metadata. +/// whereas the data fork is reserved for file data. +struct PACKED NFS_FORK_STRUCT final +{ + Kernel::Char ForkName[kNewFSForkNameLen]; + Kernel::Char CatalogName[kNewFSNodeNameLen]; + + Kernel::Int32 Flags; + Kernel::Int32 Kind; + + Kernel::Int64 ResourceId; + Kernel::Int32 ResourceKind; + Kernel::Int32 ResourceFlags; + + Kernel::Lba DataOffset; // 8 Where to look for this data? + Kernel::SizeT DataSize; /// Data size according using sector count. + + Kernel::Lba NextSibling; + Kernel::Lba PreviousSibling; +}; + +/// @brief Partition block type +struct PACKED NFS_ROOT_PARTITION_BLOCK final +{ + Kernel::Char Ident[kNewFSIdentLen]; + Kernel::Char PartitionName[kPartLen]; + + Kernel::Int32 Flags; + Kernel::Int32 Kind; + + Kernel::Lba StartCatalog; + Kernel::SizeT CatalogCount; + + Kernel::SizeT DiskSize; + + Kernel::SizeT FreeCatalog; + Kernel::SizeT FreeSectors; + + Kernel::SizeT SectorCount; + Kernel::SizeT SectorSize; + + Kernel::UInt64 Version; + + Kernel::Lba EpmBlock; + + Kernel::Char Pad[kNewFSPadLen-sizeof(Kernel::Lba)]; +}; + +namespace Kernel +{ + enum + { + kNewFSSubDriveA, + kNewFSSubDriveB, + kNewFSSubDriveC, + kNewFSSubDriveD, + kNewFSSubDriveInvalid, + kNewFSSubDriveCount, + }; + + /// \brief Resource fork kind. + enum + { + kNewFSRsrcForkKind = 0, + kNewFSDataForkKind = 1 + }; + + /// + /// \name NewFSParser + /// \brief NewFS parser class. (catalog creation, remove removal, root, + /// forks...) Designed like the DOM, detects the filesystem automatically. + /// + class NewFSParser final + { + public: + explicit NewFSParser() = default; + ~NewFSParser() = default; + + public: + NEWOS_COPY_DEFAULT(NewFSParser); + + public: + /// @brief Creates a new fork inside the New filesystem partition. + /// @param catalog it's catalog + /// @param theFork the fork itself. + /// @return the fork + _Output NFS_FORK_STRUCT* CreateFork(_Input NFS_CATALOG_STRUCT* catalog, + _Input NFS_FORK_STRUCT& theFork); + + /// @brief Find fork inside New filesystem. + /// @param catalog the catalog. + /// @param name the fork name. + /// @return the fork. + _Output NFS_FORK_STRUCT* FindFork(_Input NFS_CATALOG_STRUCT* catalog, + _Input const Char* name, + Boolean dataOrRsrc); + + _Output Void RemoveFork(_Input NFS_FORK_STRUCT* fork); + + _Output Void CloseFork(_Input NFS_FORK_STRUCT* fork); + + _Output NFS_CATALOG_STRUCT* FindCatalog(_Input const char* catalogName, Lba& outLba); + + _Output NFS_CATALOG_STRUCT* GetCatalog(_Input const char* name); + + _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name, + _Input const Int32& flags, + _Input const Int32& kind); + + _Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name); + + Bool WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, + voidPtr data, + SizeT sizeOfData, + _Input const char* forkName); + + VoidPtr ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog, + SizeT dataSz, + _Input const char* forkName); + + bool Seek(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT off); + + SizeT Tell(_Input _Output NFS_CATALOG_STRUCT* catalog); + + bool RemoveCatalog(_Input const Char* catalog); + + bool CloseCatalog(_InOut NFS_CATALOG_STRUCT* catalog); + + /// @brief Make a EPM+NewFS drive out of the disk. + /// @param drive The drive to write on. + /// @return If it was sucessful, see ErrLocal(). + bool Format(_Input _Output DriveTrait* drive, _Input const Lba endLba, _Input const Int32 flags, const Char* part_name); + + public: + Int32 fDriveIndex{kNewFSSubDriveA}; + }; + + /// + /// \name NewFilesystemHelper + /// \brief Filesystem helper and utils. + /// + + class NewFilesystemHelper final + { + public: + STATIC const char* Root(); + STATIC const char* UpDir(); + STATIC const char Separator(); + STATIC const char MetaFile(); + }; + + namespace Detail + { + Boolean fs_init_newfs(Void) noexcept; + } // namespace Detail +} // namespace Kernel + +/// @brief Write to newfs disk. +/// @param Mnt mounted interface. +/// @param DrvTrait drive info +/// @param DrvIndex drive index. +/// @return +Kernel::Int32 fs_newfs_write(Kernel::MountpointInterface* Mnt, + Kernel::DriveTrait& DrvTrait, + Kernel::Int32 DrvIndex); + +/// @brief Read from newfs disk. +/// @param Mnt mounted interface. +/// @param DrvTrait drive info +/// @param DrvIndex drive index. +/// @return +Kernel::Int32 fs_newfs_read(Kernel::MountpointInterface* Mnt, + Kernel::DriveTrait& DrvTrait, + Kernel::Int32 DrvIndex); -- cgit v1.2.3