From 74a9c08975a727527bc9754db7972d80079ef4ac Mon Sep 17 00:00:00 2001 From: Nomi Date: Tue, 26 Sep 2023 02:03:12 +0200 Subject: [PATCH] Add OpenArchive and NCCH read file errors [OpenArchive] Only throw an error if the shared extdata ID is 0xE0000000 --- src/core/fs/archive_ncch.cpp | 4 +++- src/core/kernel/file_operations.cpp | 3 ++- src/core/services/fs.cpp | 13 +++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/fs/archive_ncch.cpp b/src/core/fs/archive_ncch.cpp index d7dd1f57..8c3bd5e6 100644 --- a/src/core/fs/archive_ncch.cpp +++ b/src/core/fs/archive_ncch.cpp @@ -92,8 +92,10 @@ std::optional NCCHArchive::readFile(FileSession* file, u64 offset, u32 size } else if (highProgramID == systemDataArchive && lowProgramID == badWordList) { fileData = std::vector(std::begin(BAD_WORD_LIST_DATA), std::end(BAD_WORD_LIST_DATA)); } else { - Helpers::panic("[NCCH archive] Read from unimplemented NCCH archive file. High program ID: %08X, low ID: %08X", + Helpers::warn("[NCCH archive] Read from unimplemented NCCH archive file. High program ID: %08X, low ID: %08X", highProgramID, lowProgramID); + + return std::nullopt; } if (offset >= fileData.size()) { diff --git a/src/core/kernel/file_operations.cpp b/src/core/kernel/file_operations.cpp index c7837100..ea243663 100644 --- a/src/core/kernel/file_operations.cpp +++ b/src/core/kernel/file_operations.cpp @@ -111,7 +111,8 @@ void Kernel::readFile(u32 messagePointer, Handle fileHandle) { auto archive = file->archive; std::optional bytesRead = archive->readFile(file, offset, size, dataPointer); if (!bytesRead.has_value()) { - Helpers::panic("Kernel::ReadFile failed"); + Helpers::warn("Kernel::ReadFile failed"); + mem.write32(messagePointer + 4, 0xC8804478); } else { mem.write32(messagePointer + 4, Result::Success); mem.write32(messagePointer + 8, bytesRead.value()); diff --git a/src/core/services/fs.cpp b/src/core/services/fs.cpp index 1c243a57..7b963481 100644 --- a/src/core/services/fs.cpp +++ b/src/core/services/fs.cpp @@ -236,6 +236,19 @@ void FSService::openArchive(u32 messagePointer) { auto archivePath = readPath(archivePathType, archivePathPointer, archivePathSize); log("FS::OpenArchive(archive ID = %d, archive path type = %d)\n", archiveID, archivePathType); + // Needed for HOME Menu + if ((archiveID == 7) && (archivePathType == 2)) { + const u32 id = *(u32*)&archivePath.binary[4]; + + if (id == 0xE0000000) { + log("FS::OpenArchive: Failed to open archive\n"); + mem.write32(messagePointer + 4, 0xC8804478); + mem.write64(messagePointer + 8, 0); + + return; + } + } + Rust::Result res = openArchiveHandle(archiveID, archivePath); mem.write32(messagePointer, IPC::responseHeader(0x80C, 3, 0)); if (res.isOk()) {