citra-emu
/
citra
Archived
1
0
Fork 0

Loader: Don’t assume the file hasn’t been read before.

This commit is contained in:
Emmanuel Gil Peyrot 2015-01-06 22:47:43 +00:00
parent b5237e885d
commit 04622a859c
3 changed files with 13 additions and 4 deletions

View File

@ -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;

View File

@ -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);

View File

@ -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;