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:
|
||||||
|
|
Reference in New Issue