mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +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…
	
	Add table
		Add a link
		
	
		Reference in a new issue