|
|
|
@ -125,7 +125,7 @@ ResultStatus AppLoader_NCCH::LoadSectionExeFS(const char* name, std::vector<u8>& |
|
|
|
|
|
|
|
s64 section_offset = (exefs_header.section[i].offset + exefs_offset + |
|
|
|
sizeof(ExeFs_Header)+ncch_offset); |
|
|
|
file->Seek(section_offset, 0); |
|
|
|
file->Seek(section_offset, SEEK_SET); |
|
|
|
|
|
|
|
// Section is compressed...
|
|
|
|
if (i == 0 && is_compressed) { |
|
|
|
@ -165,13 +165,16 @@ ResultStatus AppLoader_NCCH::Load() { |
|
|
|
if (!file->IsOpen()) |
|
|
|
return ResultStatus::Error; |
|
|
|
|
|
|
|
// Reset read pointer in case this file has been read before.
|
|
|
|
file->Seek(0, SEEK_SET); |
|
|
|
|
|
|
|
file->ReadBytes(&ncch_header, sizeof(NCCH_Header)); |
|
|
|
|
|
|
|
// Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
|
|
|
|
if (0 == memcmp(&ncch_header.magic, "NCSD", 4)) { |
|
|
|
LOG_WARNING(Loader, "Only loading the first (bootable) NCCH within the NCSD file!"); |
|
|
|
ncch_offset = 0x4000; |
|
|
|
file->Seek(ncch_offset, 0); |
|
|
|
file->Seek(ncch_offset, SEEK_SET); |
|
|
|
file->ReadBytes(&ncch_header, sizeof(NCCH_Header)); |
|
|
|
} |
|
|
|
|
|
|
|
@ -198,7 +201,7 @@ ResultStatus AppLoader_NCCH::Load() { |
|
|
|
LOG_DEBUG(Loader, "ExeFS offset: 0x%08X", exefs_offset); |
|
|
|
LOG_DEBUG(Loader, "ExeFS size: 0x%08X", exefs_size); |
|
|
|
|
|
|
|
file->Seek(exefs_offset + ncch_offset, 0); |
|
|
|
file->Seek(exefs_offset + ncch_offset, SEEK_SET); |
|
|
|
file->ReadBytes(&exefs_header, sizeof(ExeFs_Header)); |
|
|
|
|
|
|
|
LoadExec(); // Load the executable into memory for booting
|
|
|
|
@ -238,7 +241,7 @@ ResultStatus AppLoader_NCCH::ReadRomFS(std::vector<u8>& buffer) const { |
|
|
|
|
|
|
|
buffer.resize(romfs_size); |
|
|
|
|
|
|
|
file->Seek(romfs_offset, 0); |
|
|
|
file->Seek(romfs_offset, SEEK_SET); |
|
|
|
file->ReadBytes(&buffer[0], romfs_size); |
|
|
|
|
|
|
|
return ResultStatus::Success; |
|
|
|
|