mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	
						commit
						b58a48d796
					
				
					 3 changed files with 61 additions and 3 deletions
				
			
		|  | @ -62,6 +62,10 @@ struct THREEDSX_Header | ||||||
|     // Sizes of the code, rodata and data segments +
 |     // Sizes of the code, rodata and data segments +
 | ||||||
|     // size of the BSS section (uninitialized latter half of the data segment)
 |     // size of the BSS section (uninitialized latter half of the data segment)
 | ||||||
|     u32 code_seg_size, rodata_seg_size, data_seg_size, bss_size; |     u32 code_seg_size, rodata_seg_size, data_seg_size, bss_size; | ||||||
|  |     // offset and size of smdh
 | ||||||
|  |     u32 smdh_offset, smdh_size; | ||||||
|  |     // offset to filesystem
 | ||||||
|  |     u32 fs_offset; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| // Relocation header: all fields (even extra unknown fields) are guaranteed to be relocation counts.
 | // Relocation header: all fields (even extra unknown fields) are guaranteed to be relocation counts.
 | ||||||
|  | @ -267,4 +271,40 @@ ResultStatus AppLoader_THREEDSX::Load() { | ||||||
|     return ResultStatus::Success; |     return ResultStatus::Success; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ResultStatus AppLoader_THREEDSX::ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, u64& size) { | ||||||
|  |     if (!file.IsOpen()) | ||||||
|  |         return ResultStatus::Error; | ||||||
|  | 
 | ||||||
|  |     // Reset read pointer in case this file has been read before.
 | ||||||
|  |     file.Seek(0, SEEK_SET); | ||||||
|  | 
 | ||||||
|  |     THREEDSX_Header hdr; | ||||||
|  |     if (file.ReadBytes(&hdr, sizeof(THREEDSX_Header)) != sizeof(THREEDSX_Header)) | ||||||
|  |         return ResultStatus::Error; | ||||||
|  | 
 | ||||||
|  |     if (hdr.header_size != sizeof(THREEDSX_Header)) | ||||||
|  |         return ResultStatus::Error; | ||||||
|  | 
 | ||||||
|  |     // Check if the 3DSX has a RomFS...
 | ||||||
|  |     if (hdr.fs_offset != 0) { | ||||||
|  |         u32 romfs_offset = hdr.fs_offset; | ||||||
|  |         u32 romfs_size = file.GetSize() - hdr.fs_offset; | ||||||
|  | 
 | ||||||
|  |         LOG_DEBUG(Loader, "RomFS offset:           0x%08X", romfs_offset); | ||||||
|  |         LOG_DEBUG(Loader, "RomFS size:             0x%08X", romfs_size); | ||||||
|  | 
 | ||||||
|  |         // We reopen the file, to allow its position to be independent from file's
 | ||||||
|  |         romfs_file = std::make_shared<FileUtil::IOFile>(filepath, "rb"); | ||||||
|  |         if (!romfs_file->IsOpen()) | ||||||
|  |             return ResultStatus::Error; | ||||||
|  | 
 | ||||||
|  |         offset = romfs_offset; | ||||||
|  |         size = romfs_size; | ||||||
|  | 
 | ||||||
|  |         return ResultStatus::Success; | ||||||
|  |     } | ||||||
|  |     LOG_DEBUG(Loader, "3DSX has no RomFS"); | ||||||
|  |     return ResultStatus::ErrorNotUsed; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace Loader
 | } // namespace Loader
 | ||||||
|  |  | ||||||
|  | @ -17,8 +17,8 @@ namespace Loader { | ||||||
| /// Loads an 3DSX file
 | /// Loads an 3DSX file
 | ||||||
| class AppLoader_THREEDSX final : public AppLoader { | class AppLoader_THREEDSX final : public AppLoader { | ||||||
| public: | public: | ||||||
|     AppLoader_THREEDSX(FileUtil::IOFile&& file, std::string filename) |     AppLoader_THREEDSX(FileUtil::IOFile&& file, std::string filename, const std::string& filepath) | ||||||
|         : AppLoader(std::move(file)), filename(std::move(filename)) {} |         : AppLoader(std::move(file)), filename(std::move(filename)), filepath(filepath) {} | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * Returns the type of the file |      * Returns the type of the file | ||||||
|  | @ -33,8 +33,18 @@ public: | ||||||
|      */ |      */ | ||||||
|     ResultStatus Load() override; |     ResultStatus Load() override; | ||||||
| 
 | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Get the RomFS of the application | ||||||
|  |      * @param romfs_file Reference to buffer to store data | ||||||
|  |      * @param offset     Offset in the file to the RomFS | ||||||
|  |      * @param size       Size of the RomFS in bytes | ||||||
|  |      * @return ResultStatus result of function | ||||||
|  |      */ | ||||||
|  |     ResultStatus ReadRomFS(std::shared_ptr<FileUtil::IOFile>& romfs_file, u64& offset, u64& size) override; | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     std::string filename; |     std::string filename; | ||||||
|  |     std::string filepath; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace Loader
 | } // namespace Loader
 | ||||||
|  |  | ||||||
|  | @ -116,7 +116,15 @@ ResultStatus LoadFile(const std::string& filename) { | ||||||
| 
 | 
 | ||||||
|     //3DSX file format...
 |     //3DSX file format...
 | ||||||
|     case FileType::THREEDSX: |     case FileType::THREEDSX: | ||||||
|         return AppLoader_THREEDSX(std::move(file), filename_filename).Load(); |     { | ||||||
|  |         AppLoader_THREEDSX app_loader(std::move(file), filename_filename, filename); | ||||||
|  |         // Load application and RomFS
 | ||||||
|  |         if (ResultStatus::Success == app_loader.Load()) { | ||||||
|  |             Service::FS::RegisterArchiveType(Common::make_unique<FileSys::ArchiveFactory_RomFS>(app_loader), Service::FS::ArchiveIdCode::RomFS); | ||||||
|  |             return ResultStatus::Success; | ||||||
|  |         } | ||||||
|  |         break; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     // Standard ELF file format...
 |     // Standard ELF file format...
 | ||||||
|     case FileType::ELF: |     case FileType::ELF: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue