summaryrefslogtreecommitdiffhomepage
path: root/public/frameworks
diff options
context:
space:
mode:
Diffstat (limited to 'public/frameworks')
-rw-r--r--public/frameworks/DiskImage.fwrk/headers/DiskImage.h41
-rw-r--r--public/frameworks/DiskImage.fwrk/src/DiskImage.cc66
2 files changed, 84 insertions, 23 deletions
diff --git a/public/frameworks/DiskImage.fwrk/headers/DiskImage.h b/public/frameworks/DiskImage.fwrk/headers/DiskImage.h
index ae94f154..011d5008 100644
--- a/public/frameworks/DiskImage.fwrk/headers/DiskImage.h
+++ b/public/frameworks/DiskImage.fwrk/headers/DiskImage.h
@@ -3,7 +3,7 @@
Copyright (C) 2025, Amlal EL Mahrouss, all rights reserved.
FILE: DiskImage.h
- PURPOSE: Disk Imaging.
+ PURPOSE: Disk Imaging framework.
------------------------------------------- */
@@ -14,15 +14,30 @@
#include <uuid/uuid.h>
#include <LibSCI/SCI.h>
-/// @brief EPM format disk to **out_name**
-/// @param disk_name The partition name
-/// @param sector_sz The sector size
-/// @param block_cnt The block count
-/// @param disk_sz The disk size (in bytes)
-/// @param out_name the output filesystem path.
-/// @return Status code regarding completion.
-SInt32 DIFormatDiskToFile(const char* disk_name = "Disk",
- int sector_sz = 512,
- const int block_cnt = 1,
- size_t disk_sz = gib_cast(4),
- const char* out_name = "disk.eimg") noexcept; \ No newline at end of file
+#define kDISectorSz (512)
+#define kDIMinDiskSz gib_cast(1)
+#define kDIDefaultOutputName "disk.eimg"
+
+#define kDISuccessStatus 0
+#define kDIFailureStatus 1
+
+struct DI_DISK;
+
+struct DI_DISK_IMAGE
+{
+ char disk_name[512] = "Disk Image";
+ int sector_sz = kDISectorSz;
+ const int block_cnt = 0;
+ size_t disk_sz = kDIMinDiskSz;
+ char out_name[256] = kDIDefaultOutputName;
+};
+
+/// @brief EPM format disk
+/// @param img disk image structure.
+/// @return Status code upon completion.
+SInt32 DIFormatDisk(struct DI_DISK_IMAGE& img) noexcept;
+
+/// @brief NeFS format over EPM.
+/// @param img disk image structure.
+/// @return Status code upon completion.
+SInt32 DIFormatNeFS(struct DI_DISK_IMAGE& img) noexcept;
diff --git a/public/frameworks/DiskImage.fwrk/src/DiskImage.cc b/public/frameworks/DiskImage.fwrk/src/DiskImage.cc
index 67a31ace..d009a19c 100644
--- a/public/frameworks/DiskImage.fwrk/src/DiskImage.cc
+++ b/public/frameworks/DiskImage.fwrk/src/DiskImage.cc
@@ -3,21 +3,32 @@
Copyright (C) 2025, Amlal EL Mahrouss, all rights reserved.
FILE: DiskImage.cc
- PURPOSE: Disk Imaging.
+ PURPOSE: Disk Imaging framework.
------------------------------------------- */
#include <DiskImage.fwrk/headers/DiskImage.h>
-SInt32 DIFormatDiskToFile(const char* disk_name,
- int sector_sz,
- const int block_cnt,
- size_t disk_sz,
- const char* out) noexcept
+/// @brief EPM format disk
+/// @param img disk image structure.
+/// @return Status code upon completion.
+SInt32 DIFormatDisk(struct DI_DISK_IMAGE& img) noexcept
{
+ const char* disk_name = img.disk_name;
+ int sector_sz = img.sector_sz;
+ const int block_cnt = img.block_cnt;
+ size_t disk_sz = img.disk_sz;
+ const char* out = img.out_name;
+
+ if (!img.sector_sz || (img.sector_sz % 512 != 0))
+ return kDIFailureStatus;
+
+ if (*out == 0 ||
+ *disk_name == 0)
+ return kDIFailureStatus;
+
struct ::EPM_PART_BLOCK block
{
- 0
};
block.NumBlocks = block_cnt;
@@ -33,11 +44,39 @@ SInt32 DIFormatDiskToFile(const char* disk_name,
::uuid_generate_random((NeOS::UInt8*)&block.Guid);
IOObject handle = IoOpenFile(out, nullptr);
+
+ if (!handle)
+ return kDIFailureStatus;
+
::IoWriteFile(handle, (NeOS::Char*)&block, sizeof(struct ::EPM_PART_BLOCK));
+ ::IoCloseFile(handle);
+
+ handle = nullptr;
+
+ return kDISuccessStatus;
+}
+
+/// @brief NeFS format over EPM.
+/// @param img disk image structure.
+/// @return Status code upon completion.
+SInt32 DIFormatNeFS(struct DI_DISK_IMAGE& img) noexcept
+{
+ const char* disk_name = img.disk_name;
+ int sector_sz = img.sector_sz;
+ const int block_cnt = img.block_cnt;
+ size_t disk_sz = img.disk_sz;
+ const char* out = img.out_name;
+
+ if (!img.sector_sz || (img.sector_sz % 512 != 0))
+ return kDIFailureStatus;
+
+ if (*out == 0 ||
+ *disk_name == 0)
+ return kDIFailureStatus;
+
struct ::NEFS_ROOT_PARTITION_BLOCK rpb
{
- 0
};
::MmCopyMemory(rpb.PartitionName, (VoidPtr)disk_name, ::MmStrLen(disk_name));
@@ -57,7 +96,12 @@ SInt32 DIFormatDiskToFile(const char* disk_name,
rpb.FreeSectors = rpb.SectorCount;
rpb.FreeCatalog = rpb.DiskSize / sizeof(NEFS_CATALOG_STRUCT);
- auto p_prev = ::IoTellFile(handle);
+ IOObject handle = IoOpenFile(out, nullptr);
+
+ if (!handle)
+ return kDIFailureStatus;
+
+ UInt64 p_prev = ::IoTellFile(handle);
::IoWriteFile(handle, (NeOS::Char*)&rpb, sizeof(struct ::NEFS_ROOT_PARTITION_BLOCK));
@@ -65,5 +109,7 @@ SInt32 DIFormatDiskToFile(const char* disk_name,
::IoCloseFile(handle);
- return 0;
+ handle = nullptr;
+
+ return kDISuccessStatus;
} \ No newline at end of file