diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-06-22 11:02:34 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-06-22 11:02:34 +0200 |
| commit | efd60f780ba66b363dc564b99a09b60163b9edcb (patch) | |
| tree | ddb8b4564cabc0578cedc0b2b2ec4941a9b3e35a /Kernel/Sources | |
| parent | afb57783942238da489de6677941ecc64f9d8929 (diff) | |
IMP: Support fork based operations inside the file manager, update PEF
loader to load from forks, we might need a non-fork loader class though.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel/Sources')
| -rw-r--r-- | Kernel/Sources/FileManager.cxx | 38 | ||||
| -rw-r--r-- | Kernel/Sources/PEFCodeManager.cxx | 46 |
2 files changed, 57 insertions, 27 deletions
diff --git a/Kernel/Sources/FileManager.cxx b/Kernel/Sources/FileManager.cxx index ee285ae1..9f81c260 100644 --- a/Kernel/Sources/FileManager.cxx +++ b/Kernel/Sources/FileManager.cxx @@ -81,6 +81,26 @@ namespace NewOS /// @return Void NewFilesystemManager::Write(NodePtr node, VoidPtr data, Int32 flags, SizeT size) { + auto dataForkName = kNewFSDataFork; + this->Write(dataForkName, node, data, flags, size); + } + + /// @brief Read from filesystem fork. + /// @param node the catalog node. + /// @param flags the flags with it. + /// @param sz the size to read. + /// @return + VoidPtr NewFilesystemManager::Read(NodePtr node, Int32 flags, SizeT sz) + { + auto dataForkName = kNewFSDataFork; + return this->Read(dataForkName, node, flags, sz); + } + + Void NewFilesystemManager::Write(_Input const Char* name, + _Input NodePtr node, _Input VoidPtr data, + _Input Int32 flags, + _Input SizeT size) + { if (!size || size > kNewFSForkSize) return; @@ -90,19 +110,15 @@ namespace NewOS NEWOS_UNUSED(flags); - auto dataForkName = kNewFSDataFork; - if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile) fImpl->WriteCatalog(reinterpret_cast<NewCatalog*>(node), data, size, - dataForkName); + name); } - /// @brief Read from filesystem fork. - /// @param node the catalog node. - /// @param flags the flags with it. - /// @param sz the size to read. - /// @return - VoidPtr NewFilesystemManager::Read(NodePtr node, Int32 flags, SizeT sz) + _Output VoidPtr NewFilesystemManager::Read(_Input const Char* name, + _Input NodePtr node, + _Input Int32 flags, + _Input SizeT sz) { if (sz > kNewFSForkSize) return nullptr; @@ -112,11 +128,9 @@ namespace NewOS NEWOS_UNUSED(flags); - auto dataForkName = kNewFSDataFork; - if ((reinterpret_cast<NewCatalog*>(node))->Kind == kNewFSCatalogKindFile) return fImpl->ReadCatalog(reinterpret_cast<NewCatalog*>(node), sz, - dataForkName); + name); return nullptr; } diff --git a/Kernel/Sources/PEFCodeManager.cxx b/Kernel/Sources/PEFCodeManager.cxx index e259885b..f8b50e56 100644 --- a/Kernel/Sources/PEFCodeManager.cxx +++ b/Kernel/Sources/PEFCodeManager.cxx @@ -5,7 +5,6 @@ ------------------------------------------- */ #include <KernelKit/DebugOutput.hpp> -#include <KernelKit/FileManager.hpp> #include <KernelKit/KernelHeap.hpp> #include <KernelKit/PEFCodeManager.hxx> #include <KernelKit/ProcessScheduler.hxx> @@ -49,15 +48,15 @@ namespace NewOS PEFLoader::PEFLoader(const Char* path) : fCachedBlob(nullptr), fBad(false), fFatBinary(false) { - OwnPtr<FileStream<Char>> file; + fFile.New(const_cast<Char*>(path), cRestrictRB); - file.New(const_cast<Char*>(path), kRestrictRB); - - if (StringBuilder::Equals(file->MIME(), this->MIME())) + if (StringBuilder::Equals(fFile->MIME(), this->MIME())) { fPath = StringBuilder::Construct(path).Leak(); - fCachedBlob = file->Read(); + auto cPefHeader = "PEFContainer"; + + fCachedBlob = fFile->Read(cPefHeader); PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob); @@ -85,7 +84,7 @@ namespace NewOS fBad = true; ke_delete_ke_heap(fCachedBlob); - + fCachedBlob = nullptr; } } @@ -95,6 +94,8 @@ namespace NewOS { if (fCachedBlob) ke_delete_ke_heap(fCachedBlob); + + fFile.Delete(); } VoidPtr PEFLoader::FindSymbol(const char* name, Int32 kind) @@ -104,8 +105,12 @@ namespace NewOS PEFContainer* container = reinterpret_cast<PEFContainer*>(fCachedBlob); - PEFCommandHeader* container_header = reinterpret_cast<PEFCommandHeader*>( - (UIntPtr)fCachedBlob + sizeof(PEFContainer)); + StringView cPefHeaderStr = StringBuilder::Construct("PEFContainerHeader:").Leak().Leak(); + cPefHeaderStr += name; + + auto blob = fFile->Read(cPefHeaderStr.CData()); + + PEFCommandHeader* container_header = reinterpret_cast<PEFCommandHeader*>(blob); constexpr auto cMangleCharacter = '$'; const char* cContainerKinds[] = {".code64", ".data64", ".zero64", nullptr}; @@ -114,15 +119,18 @@ namespace NewOS switch (kind) { - case kPefCode: { + case kPefCode: + { errOrSym = StringBuilder::Construct(cContainerKinds[0]); // code symbol. break; } - case kPefData: { + case kPefData: + { errOrSym = StringBuilder::Construct(cContainerKinds[1]); // data symbol. break; } - case kPefZero: { + case kPefZero: + { errOrSym = StringBuilder::Construct(cContainerKinds[2]); // block starting symbol. break; } @@ -152,15 +160,23 @@ namespace NewOS if (container_header->Cpu != Detail::rt_get_pef_platform()) { if (!this->fFatBinary) + { + ke_delete_ke_heap(blob); return nullptr; + } } - return (VoidPtr)(static_cast<UIntPtr*>(fCachedBlob) + - container_header->Offset); + Char* blobRet = new Char[container_header->Size]; + + rt_copy_memory((VoidPtr)((Char*)blob + sizeof(PEFCommandHeader)), blobRet, container_header->Size); + + ke_delete_ke_heap(blob); + return blobRet; } } } - + + ke_delete_ke_heap(blob); return nullptr; } |
