From 192892221333113b28353fbe428adfc1bf6bbaae Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sat, 10 Aug 2024 10:35:44 +0200 Subject: [FIX] [newoskrnl.dll] Fixed it's heap and improved it as well. [FIX] Fix memory leak in TrySave. (\Kernel\Sources\User.cxx) Signed-off-by: Amlal EL Mahrouss --- Kernel/Sources/DriveManager.cxx | 6 ++++-- Kernel/Sources/FS/NewFS.cxx | 21 +++------------------ Kernel/Sources/HalPageAlloc.cxx | 28 +++++++++++++++++----------- Kernel/Sources/NewFS+FileManager.cxx | 2 ++ Kernel/Sources/User.cxx | 15 ++++++++++++++- 5 files changed, 40 insertions(+), 32 deletions(-) (limited to 'Kernel/Sources') diff --git a/Kernel/Sources/DriveManager.cxx b/Kernel/Sources/DriveManager.cxx index 80df09bf..fae54314 100644 --- a/Kernel/Sources/DriveManager.cxx +++ b/Kernel/Sources/DriveManager.cxx @@ -136,14 +136,16 @@ namespace Kernel { DriveTrait trait; - rt_copy_memory((VoidPtr) "/Mount/MainDisk/", trait.fName, rt_string_len("/Mount/MainDisk/")); - trait.fKind = kMassStorage | kEPMDrive; + rt_copy_memory((VoidPtr) "MainDisk", trait.fName, rt_string_len("MainDisk")); + trait.fKind = kMassStorage; trait.fInput = ke_drv_input; trait.fOutput = ke_drv_output; trait.fVerify = ke_drv_check_disk; trait.fDriveKind = io_drive_kind; + kcout << "newoskrnl: Construct drive with success.\r"; + return trait; } } // namespace Kernel diff --git a/Kernel/Sources/FS/NewFS.cxx b/Kernel/Sources/FS/NewFS.cxx index 23d2867f..83c39e4b 100644 --- a/Kernel/Sources/FS/NewFS.cxx +++ b/Kernel/Sources/FS/NewFS.cxx @@ -1029,26 +1029,11 @@ namespace Kernel::Detail sMountpointInterface.C() = io_construct_drive(); sMountpointInterface.D() = io_construct_drive(); - sMountpointInterface.A().fVerify(&sMountpointInterface.A().fPacket); - - Char partitionBlockBuf[sizeof(NFS_ROOT_PARTITION_BLOCK)] = {0}; - - sMountpointInterface.A().fPacket.fLba = kNewFSStartLba; - sMountpointInterface.A().fPacket.fPacketContent = partitionBlockBuf; - sMountpointInterface.A().fPacket.fPacketSize = sizeof(NFS_ROOT_PARTITION_BLOCK); - - sMountpointInterface.A().fInput(&sMountpointInterface.A().fPacket); - - NFS_ROOT_PARTITION_BLOCK* partBlock = - reinterpret_cast(partitionBlockBuf); + kcout << "newoskrnl: Testing drive...\r"; - if (!StringBuilder::Equals(partBlock->Ident, kNewFSIdent)) - { - kcout << "newoskrnl: New FS Partition is corrupt.\r"; - return false; - } + sMountpointInterface.A().fVerify(&sMountpointInterface.A().fPacket); - kcout << "newoskrnl: Read partition: " << partBlock->PartitionName << ", with success!\r"; + kcout << "newoskrnl: Testing drive [ OK ]...\r"; return true; } diff --git a/Kernel/Sources/HalPageAlloc.cxx b/Kernel/Sources/HalPageAlloc.cxx index f22db98a..d1fe83a7 100644 --- a/Kernel/Sources/HalPageAlloc.cxx +++ b/Kernel/Sources/HalPageAlloc.cxx @@ -19,11 +19,13 @@ Kernel::Boolean kAllocationInProgress = false; namespace Kernel { + constexpr auto cVMTMagic = 0xDEEFD00D; + namespace HAL { namespace Detail { - struct VirtualMemoryHeader + struct VIRTUAL_MEMORY_HEADER { UInt32 Magic; Boolean Present; @@ -32,22 +34,28 @@ namespace Kernel SizeT Size; }; - struct VirtualMemoryHeaderTraits + struct VirtualMemoryHeaderTraits final { /// @brief Get next header. /// @param current /// @return - VirtualMemoryHeader* Next(VirtualMemoryHeader* current) + VIRTUAL_MEMORY_HEADER* Next(VIRTUAL_MEMORY_HEADER* current) { - return current + sizeof(VirtualMemoryHeader) + current->Size; + if (current->Magic != cVMTMagic) + current->Size = 8196; + + return current + sizeof(VIRTUAL_MEMORY_HEADER) + current->Size; } /// @brief Get previous header. /// @param current /// @return - VirtualMemoryHeader* Prev(VirtualMemoryHeader* current) + VIRTUAL_MEMORY_HEADER* Prev(VIRTUAL_MEMORY_HEADER* current) { - return current - sizeof(VirtualMemoryHeader) - current->Size; + if (current->Magic != cVMTMagic) + current->Size = 8196; + + return current - sizeof(VIRTUAL_MEMORY_HEADER) - current->Size; } }; } // namespace Detail @@ -64,14 +72,12 @@ namespace Kernel kAllocationInProgress = true; - constexpr auto cVMTMagic = 0xDEEFD00D; - ///! fetch from the start. - Detail::VirtualMemoryHeader* vmHeader = reinterpret_cast(kKernelVirtualStart); + Detail::VIRTUAL_MEMORY_HEADER* vmHeader = reinterpret_cast(kKernelVMTStart); Detail::VirtualMemoryHeaderTraits traits; while (vmHeader->Present && - vmHeader->Magic != cVMTMagic) + vmHeader->Magic == cVMTMagic) { vmHeader = traits.Next(vmHeader); } @@ -84,7 +90,7 @@ namespace Kernel kAllocationInProgress = false; - return reinterpret_cast(vmHeader); + return reinterpret_cast(vmHeader + sizeof(Detail::VIRTUAL_MEMORY_HEADER)); } /// @brief Allocate a new page to be used by the OS. diff --git a/Kernel/Sources/NewFS+FileManager.cxx b/Kernel/Sources/NewFS+FileManager.cxx index 0018a7ff..b1622f77 100644 --- a/Kernel/Sources/NewFS+FileManager.cxx +++ b/Kernel/Sources/NewFS+FileManager.cxx @@ -19,6 +19,8 @@ namespace Kernel { MUST_PASS(Detail::fs_init_newfs()); fImpl = new NewFSParser(); + + kcout << "We are done here... (NewFilesystemManager).\r"; } NewFilesystemManager::~NewFilesystemManager() diff --git a/Kernel/Sources/User.cxx b/Kernel/Sources/User.cxx index 46dd0d76..ee825400 100644 --- a/Kernel/Sources/User.cxx +++ b/Kernel/Sources/User.cxx @@ -58,6 +58,8 @@ namespace Kernel Bool User::TrySave(const Char* password) noexcept { + kcout << "Trying to save password...\r"; + SizeT len = rt_string_len(password); Char* token = new Char[len]; @@ -70,17 +72,28 @@ namespace Kernel if (NewFilesystemManager::GetMounted()) { - if (auto dir = NewFilesystemManager::GetMounted()->CreateDirectory("\\Users")) + if (auto dir = NewFilesystemManager::GetMounted()->CreateDirectory("\\Users"); + dir) + { delete dir; + } + else + { + delete token; + return false; + } auto node = NewFilesystemManager::GetMounted()->Create(kUsersFile); NewFilesystemManager::GetMounted()->Write(this->fUserName.CData(), node, (VoidPtr)token, this->IsStdUser() ? 0xCF : 0xEF, len); delete node; + delete token; return true; } + delete token; + return false; } -- cgit v1.2.3