mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu.git
				synced 2025-05-12 00:45:25 +00:00 
			
		
		
		
	Implement 3dsx RomFS
This commit is contained in:
		
							parent
							
								
									f7b4f44adf
								
							
						
					
					
						commit
						d60a9be5c6
					
				@ -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…
	
		Reference in New Issue
	
	Block a user