summaryrefslogtreecommitdiffhomepage
path: root/Private/NewBoot/BootKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-04-29 10:12:36 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-04-29 10:12:36 +0200
commit461fe537aa1f9533bfa5c2504cb84843b9eac501 (patch)
tree271395a293f788775c09abffdc0861dbf24af4ca /Private/NewBoot/BootKit
parent346558208d39a036effe3a4ec232fa5df5a3c8e7 (diff)
MHR-18: Filesystem fixes and improvements see ticket.
- Implement CreateCatalog for file creation, an implementation of RemoveCatalog is also needed. - Boot Kit only takes a single root file now. Must be ending with '/'. Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'Private/NewBoot/BootKit')
-rw-r--r--Private/NewBoot/BootKit/BootKit.hxx145
-rw-r--r--Private/NewBoot/BootKit/Vendor/Support.hxx3
2 files changed, 68 insertions, 80 deletions
diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx
index c3e438ae..47a8c9a2 100644
--- a/Private/NewBoot/BootKit/BootKit.hxx
+++ b/Private/NewBoot/BootKit/BootKit.hxx
@@ -186,16 +186,9 @@ public:
Char fForkName[kNewFSNodeNameLen];
Int32 fKind;
- Int64 fLba;
VoidPtr fBlob;
SizeT fBlobSz;
-
- bool IsCatalogValid() { return fLba != 0 && fLba >= kNewFSCatalogStartAddress; }
-
- struct BFileDescriptor* fParent;
- struct BFileDescriptor* fPrev;
- struct BFileDescriptor* fNext;
};
public:
@@ -236,7 +229,8 @@ public:
if (blockPart->DiskSize != this->fDiskDev.GetDiskSize() ||
blockPart->DiskSize < 1 ||
- blockPart->SectorSize != BootDev::kSectorSize) {
+ blockPart->SectorSize != BootDev::kSectorSize ||
+ blockPart->Version != kNewFSVersionInteger) {
EFI::ThrowError(L"Invalid-Disk-Geometry", L"Invalid disk geometry.");
} else if (blockPart->PartitionName[0] == 0) {
EFI::ThrowError(L"Invalid-Partition-Name", L"Invalid disk partition.");
@@ -263,103 +257,95 @@ private:
Char bufCatalog[sizeof(NewCatalog)] = { 0 };
Char bufFork[sizeof(NewFork)] = { 0 };
- while (blob) {
- NewCatalog* catalogKind = (NewCatalog*)bufCatalog;
-
- blob->fLba = startLba;
-
- if (!blob->fParent)
- catalogKind->PrevSibling = startLba;
- else {
- if (blob->IsCatalogValid()) {
- catalogKind->PrevSibling = blob->fParent->fLba;
- } else {
- EFI::ThrowError(L"Invalid-Catalog-Location", L"Invalid catalog location.");
- }
- }
-
- /// Fill catalog kind.
- catalogKind->Kind = blob->fKind;
+ NewCatalog* catalogKind = (NewCatalog*)bufCatalog;
+ catalogKind->PrevSibling = startLba;
+ catalogKind->NextSibling = (sizeof(NewCatalog) + sizeof(NewFork) + blob->fBlobSz);
- /// Allocate fork for blob.
- if (catalogKind->Kind == kNewFSDataForkKind) {
- catalogKind->DataFork = (startLba + sizeof(NewCatalog));
- } else {
- catalogKind->ResourceFork = (startLba + sizeof(NewCatalog));
- }
+ /// Fill catalog kind.
+ catalogKind->Kind = blob->fKind;
- NewFork* forkKind = (NewFork*)bufFork;
+ /// Allocate fork for blob.
+ if (catalogKind->Kind == kNewFSDataForkKind) {
+ catalogKind->DataFork = (startLba + sizeof(NewCatalog));
+ catalogKind->DataForkSize += blob->fBlobSz;
+ } else {
+ catalogKind->ResourceFork = (startLba + sizeof(NewCatalog));
+ catalogKind->ResourceForkOverallSize += blob->fBlobSz;
+ }
- memcpy(forkKind->Name, blob->fForkName, strlen(blob->fForkName));
- forkKind->Kind = (forkKind->Name[0] == kNewFSDataFork[0]) ? kNewFSDataForkKind : kNewFSRsrcForkKind;
- forkKind->Flags = kNewFSFlagCreated;
+ /// before going to forks, we must check for the catalog name first.
+ if (blob->fKind == kNewFSCatalogKindDir &&
+ blob->fFileName[strlen(blob->fFileName) - 1] != '/') {
+ EFI::ThrowError(L"Developer-Error", L"This is caused by the developer of the bootloader.");
+ }
- /// We don't know.
- forkKind->ResourceFlags = 0;
- forkKind->ResourceId = 0;
- forkKind->ResourceKind = 0;
+ NewFork* forkKind = (NewFork*)bufFork;
- /// We're the only fork here.
- forkKind->NextSibling = forkKind->Kind == kNewFSDataForkKind ? catalogKind->DataFork : catalogKind->ResourceFork;
- forkKind->PreviousSibling = kNewFSDataForkKind ? catalogKind->DataFork : catalogKind->ResourceFork;
+ memcpy(forkKind->Name, blob->fForkName, strlen(blob->fForkName));
+ forkKind->Kind = (forkKind->Name[0] == kNewFSDataFork[0]) ? kNewFSDataForkKind : kNewFSRsrcForkKind;
+ forkKind->Flags = kNewFSFlagCreated;
- forkKind->DataOffset = (startLba + sizeof(NewCatalog) + sizeof(NewFork));
- forkKind->DataSize = blob->fBlobSz;
+ /// We don't know.
+ forkKind->ResourceFlags = 0;
+ forkKind->ResourceId = 0;
+ forkKind->ResourceKind = 0;
- SizeT cur = 0UL;
+ /// We're the only fork here.
+ forkKind->NextSibling = forkKind->Kind == kNewFSDataForkKind ? catalogKind->DataFork : catalogKind->ResourceFork;
+ forkKind->PreviousSibling = kNewFSDataForkKind ? catalogKind->DataFork : catalogKind->ResourceFork;
- writer.Write((catalogKind->Kind == kNewFSCatalogKindFile) ? L"New Boot: Write-File: " :
- L"New Boot: Write-Directory: " ).Write(blob->fFileName).Write(L"\r\n");
+ forkKind->DataOffset = (startLba + sizeof(NewCatalog) + sizeof(NewFork));
+ forkKind->DataSize = blob->fBlobSz;
- /// Set disk cursor here.
+ SizeT cur = 0UL;
- fDiskDev.Leak().mBase = startLba + sizeof(NewCatalog);
- fDiskDev.Leak().mSize = sizeof(NewFork);
+ writer.Write((catalogKind->Kind == kNewFSCatalogKindFile) ? L"New Boot: Write-File: " :
+ L"New Boot: Write-Directory: " ).Write(blob->fFileName).Write(L"\r\n");
- fDiskDev.Write((Char*)bufFork, sizeof(NewFork));
+ /// Set disk cursor here.
- do {
- this->fDiskDev.Leak().mSize = BootDev::kSectorSize;
- this->fDiskDev.Leak().mBase = (forkKind->DataOffset + cur);
+ fDiskDev.Leak().mBase = startLba + sizeof(NewCatalog);
+ fDiskDev.Leak().mSize = sizeof(NewFork);
- this->fDiskDev.Write((Char*)(blob->fBlob) + cur, BootDev::kSectorSize);
+ fDiskDev.Write((Char*)bufFork, sizeof(NewFork));
- cur += BootDev::kSectorSize;
- } while (cur < forkKind->DataSize);
+ do {
+ this->fDiskDev.Leak().mSize = BootDev::kSectorSize;
+ this->fDiskDev.Leak().mBase = (forkKind->DataOffset + cur);
- /// Fork is done.
+ this->fDiskDev.Write((Char*)(blob->fBlob) + cur, BootDev::kSectorSize);
- catalogKind->Kind = blob->fKind;
- catalogKind->Flags |= kNewFSFlagCreated;
+ cur += BootDev::kSectorSize;
+ } while (cur < forkKind->DataSize);
- //// Now write catalog as well..
+ /// Fork is done.
- /// this mime only applies to file.
- if (catalogKind->Kind == kNewFSCatalogKindFile) {
- memcpy(catalogKind->Mime, kBKBootFileMime, strlen(kBKBootFileMime));
- } else {
- memcpy(catalogKind->Mime, kBKBootDirMime, strlen(kBKBootDirMime));
- }
+ catalogKind->Kind = blob->fKind;
+ catalogKind->Flags = kNewFSFlagCreated;
- memcpy(catalogKind->Name, blob->fFileName, strlen(blob->fFileName));
+ //// Now write catalog as well..
- catalogKind->NextSibling = startLba + (sizeof(NewCatalog) + sizeof(NewFork) + blob->fBlobSz);
+ /// this mime only applies to file.
+ if (catalogKind->Kind == kNewFSCatalogKindFile) {
+ memcpy(catalogKind->Mime, kBKBootFileMime, strlen(kBKBootFileMime));
+ } else {
+ memcpy(catalogKind->Mime, kBKBootDirMime, strlen(kBKBootDirMime));
+ }
- fDiskDev.Leak().mBase = startLba;
- fDiskDev.Leak().mSize = sizeof(NewCatalog);
+ memcpy(catalogKind->Name, blob->fFileName, strlen(blob->fFileName));
- fDiskDev.Write((Char*)bufCatalog, sizeof(NewCatalog));
+ fDiskDev.Leak().mBase = startLba;
+ fDiskDev.Leak().mSize = sizeof(NewCatalog);
- startLba += (sizeof(NewCatalog) + sizeof(NewFork) + blob->fBlobSz);
+ fDiskDev.Write((Char*)bufCatalog, sizeof(NewCatalog));
- --partBlock.FreeCatalog;
- --partBlock.FreeSectors;
+ startLba += (sizeof(NewCatalog) + sizeof(NewFork) + blob->fBlobSz);
- memset(bufFork, 0, sizeof(NewFork));
- memset(bufCatalog, 0, sizeof(NewCatalog));
+ --partBlock.FreeCatalog;
+ --partBlock.FreeSectors;
- blob = blob->fNext;
- }
+ memset(bufFork, 0, sizeof(NewFork));
+ memset(bufCatalog, 0, sizeof(NewCatalog));
return true;
}
@@ -391,6 +377,7 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const char* partName,
/// @note A catalog roughly equal to a sector.
+ partBlock->Version = kNewFSVersionInteger;
partBlock->CatalogCount = blobCount;
partBlock->Kind = kNewFSHardDrive;
partBlock->SectorSize = sectorSz;
diff --git a/Private/NewBoot/BootKit/Vendor/Support.hxx b/Private/NewBoot/BootKit/Vendor/Support.hxx
index b4ba4f68..fe3d35c3 100644
--- a/Private/NewBoot/BootKit/Vendor/Support.hxx
+++ b/Private/NewBoot/BootKit/Vendor/Support.hxx
@@ -15,7 +15,8 @@
#define SetMem(dst, c, sz) memset(dst, c, sz)
#define MoveMem(dst, src, sz) memcpy(dst, src, sz)
-#define CopyMem(dst, src, sz) memcpy(dst,src, sz)
+#define CopyMem(dst, src, sz) memcpy(dst, src, sz)
+#define StrLen(src) strlen(src)
inline int isspace(int c) { return c == ' '; }