mirror of
https://github.com/PabloMK7/citra.git
synced 2024-11-29 19:00:17 +00:00
Loader: Don’t assume the file hasn’t been read before.
This commit is contained in:
parent
b5237e885d
commit
04622a859c
3 changed files with 13 additions and 4 deletions
|
@ -100,6 +100,9 @@ static THREEDSX_Error Load3DSXFile(FileUtil::IOFile& file, u32 base_addr)
|
||||||
if (!file.IsOpen())
|
if (!file.IsOpen())
|
||||||
return ERROR_FILE;
|
return ERROR_FILE;
|
||||||
|
|
||||||
|
// Reset read pointer in case this file has been read before.
|
||||||
|
file.Seek(0, SEEK_SET);
|
||||||
|
|
||||||
THREEDSX_Header hdr;
|
THREEDSX_Header hdr;
|
||||||
if (file.ReadBytes(&hdr, sizeof(hdr)) != sizeof(hdr))
|
if (file.ReadBytes(&hdr, sizeof(hdr)) != sizeof(hdr))
|
||||||
return ERROR_READ;
|
return ERROR_READ;
|
||||||
|
|
|
@ -337,6 +337,9 @@ ResultStatus AppLoader_ELF::Load() {
|
||||||
if (!file->IsOpen())
|
if (!file->IsOpen())
|
||||||
return ResultStatus::Error;
|
return ResultStatus::Error;
|
||||||
|
|
||||||
|
// Reset read pointer in case this file has been read before.
|
||||||
|
file->Seek(0, SEEK_SET);
|
||||||
|
|
||||||
u32 size = static_cast<u32>(file->GetSize());
|
u32 size = static_cast<u32>(file->GetSize());
|
||||||
std::unique_ptr<u8[]> buffer(new u8[size]);
|
std::unique_ptr<u8[]> buffer(new u8[size]);
|
||||||
file->ReadBytes(&buffer[0], size);
|
file->ReadBytes(&buffer[0], size);
|
||||||
|
|
|
@ -125,7 +125,7 @@ ResultStatus AppLoader_NCCH::LoadSectionExeFS(const char* name, std::vector<u8>&
|
||||||
|
|
||||||
s64 section_offset = (exefs_header.section[i].offset + exefs_offset +
|
s64 section_offset = (exefs_header.section[i].offset + exefs_offset +
|
||||||
sizeof(ExeFs_Header)+ncch_offset);
|
sizeof(ExeFs_Header)+ncch_offset);
|
||||||
file->Seek(section_offset, 0);
|
file->Seek(section_offset, SEEK_SET);
|
||||||
|
|
||||||
// Section is compressed...
|
// Section is compressed...
|
||||||
if (i == 0 && is_compressed) {
|
if (i == 0 && is_compressed) {
|
||||||
|
@ -165,13 +165,16 @@ ResultStatus AppLoader_NCCH::Load() {
|
||||||
if (!file->IsOpen())
|
if (!file->IsOpen())
|
||||||
return ResultStatus::Error;
|
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));
|
file->ReadBytes(&ncch_header, sizeof(NCCH_Header));
|
||||||
|
|
||||||
// Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
|
// Skip NCSD header and load first NCCH (NCSD is just a container of NCCH files)...
|
||||||
if (0 == memcmp(&ncch_header.magic, "NCSD", 4)) {
|
if (0 == memcmp(&ncch_header.magic, "NCSD", 4)) {
|
||||||
LOG_WARNING(Loader, "Only loading the first (bootable) NCCH within the NCSD file!");
|
LOG_WARNING(Loader, "Only loading the first (bootable) NCCH within the NCSD file!");
|
||||||
ncch_offset = 0x4000;
|
ncch_offset = 0x4000;
|
||||||
file->Seek(ncch_offset, 0);
|
file->Seek(ncch_offset, SEEK_SET);
|
||||||
file->ReadBytes(&ncch_header, sizeof(NCCH_Header));
|
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 offset: 0x%08X", exefs_offset);
|
||||||
LOG_DEBUG(Loader, "ExeFS size: 0x%08X", exefs_size);
|
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));
|
file->ReadBytes(&exefs_header, sizeof(ExeFs_Header));
|
||||||
|
|
||||||
LoadExec(); // Load the executable into memory for booting
|
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);
|
buffer.resize(romfs_size);
|
||||||
|
|
||||||
file->Seek(romfs_offset, 0);
|
file->Seek(romfs_offset, SEEK_SET);
|
||||||
file->ReadBytes(&buffer[0], romfs_size);
|
file->ReadBytes(&buffer[0], romfs_size);
|
||||||
|
|
||||||
return ResultStatus::Success;
|
return ResultStatus::Success;
|
||||||
|
|
Loading…
Reference in a new issue