diff options
| author | Amlal <amlalelmahrouss@icloud.com> | 2024-04-29 15:01:06 +0000 |
|---|---|---|
| committer | Amlal <amlalelmahrouss@icloud.com> | 2024-04-29 15:01:06 +0000 |
| commit | a06c8a375f0c5f5e3613e9fe8228cebf442731ba (patch) | |
| tree | 84b30c251e1b444873f4723ecab047689526e9f0 /Private/NewBoot/BootKit | |
| parent | 14f10cc0b35155ddb19ec9069ebb884246e61dcf (diff) | |
| parent | a21859d722597e4eb1216a4a48d08d8f2659b514 (diff) | |
Merged in MHR-18 (pull request #9)
MHR-18
Diffstat (limited to 'Private/NewBoot/BootKit')
| -rw-r--r-- | Private/NewBoot/BootKit/BootKit.hxx | 153 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/Vendor/Support.hxx | 3 |
2 files changed, 73 insertions, 83 deletions
diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index c3e438ae..ca6f56ac 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."); @@ -252,7 +246,7 @@ private: /// @param fileBlobs the blobs. /// @param blobCount the number of blobs to write. /// @param partBlock the NewFS partition block. - Boolean FormatCatalog(BFileDescriptor* fileBlobs, SizeT blobCount, + Boolean WriteRootCatalog(BFileDescriptor* fileBlobs, SizeT blobCount, NewPartitionBlock& partBlock) { if (partBlock.SectorSize != BootDev::kSectorSize) return false; @@ -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,16 +377,19 @@ 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; - partBlock->FreeCatalog = fDiskDev.GetSectorsCount(); + partBlock->FreeCatalog = fDiskDev.GetSectorsCount() / sizeof(NewCatalog); partBlock->SectorCount = fDiskDev.GetSectorsCount(); partBlock->FreeSectors = fDiskDev.GetSectorsCount(); partBlock->StartCatalog = kNewFSCatalogStartAddress; partBlock->DiskSize = fDiskDev.GetDiskSize(); + partBlock->Flags |= kNewFSPartitionTypeBoot; - if (this->FormatCatalog(fileBlobs, blobCount, *partBlock)) { + /// if we can write a root catalog, then write the partition block. + if (this->WriteRootCatalog(fileBlobs, blobCount, *partBlock)) { fDiskDev.Leak().mBase = kNewFSAddressAsLba; fDiskDev.Leak().mSize = 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 == ' '; } |
