diff --git a/stratosphere/fs_mitm/source/fsmitm_layeredrom.cpp b/stratosphere/fs_mitm/source/fsmitm_layeredrom.cpp
index ed6ad63..2b2bbed 100644
--- a/stratosphere/fs_mitm/source/fsmitm_layeredrom.cpp
+++ b/stratosphere/fs_mitm/source/fsmitm_layeredrom.cpp
@@ -83,6 +83,22 @@
cur_read_size = cur_source->size - (offset - cur_source->virtual_offset);
}
switch (cur_source->type) {
+ case RomFSDataSource::MetaData:
+ {
+ FsFile file;
+ if (R_FAILED((rc = Utils::OpenSdFileForAtmosphere(this->title_id, ROMFS_METADATA_FILE_PATH, FS_OPEN_READ, &file)))) {
+ fatalSimple(rc);
+ }
+ size_t out_read;
+ if (R_FAILED((rc = fsFileRead(&file, (offset - cur_source->virtual_offset), (void *)((uintptr_t)buffer + read_so_far), cur_read_size, &out_read)))) {
+ fatalSimple(rc);
+ }
+ if (out_read != cur_read_size) {
+ Reboot();
+ }
+ fsFileClose(&file);
+ }
+ break;
case RomFSDataSource::LooseFile:
{
FsFile file;
diff --git a/stratosphere/fs_mitm/source/fsmitm_romfsbuild.cpp b/stratosphere/fs_mitm/source/fsmitm_romfsbuild.cpp
index 4a01bff..7b63b2b 100644
--- a/stratosphere/fs_mitm/source/fsmitm_romfsbuild.cpp
+++ b/stratosphere/fs_mitm/source/fsmitm_romfsbuild.cpp
@@ -399,23 +399,14 @@
header->file_hash_table_ofs = header->dir_table_ofs + header->dir_table_size;
header->file_table_ofs = header->file_hash_table_ofs + header->file_hash_table_size;
- /* For debugging, uncomment this to get a log of the generated metadata tables. */
+ const size_t metadata_size = this->dir_hash_table_size + this->dir_table_size + this->file_hash_table_size + this->file_table_size;
- {
- FsFileSystem sd_fs;
- if (R_SUCCEEDED(fsMountSdcard(&sd_fs))) {
- FsFile f;
- fsFsCreateFile(&sd_fs, "/METADATALOG.bin", this->dir_hash_table_size + this->dir_table_size + this->file_hash_table_size + this->file_table_size + sizeof(*header), 0);
- if (R_SUCCEEDED(fsFsOpenFile(&sd_fs, "/METADATALOG.bin", FS_OPEN_READ | FS_OPEN_WRITE, &f))) {
- fsFileSetSize(&f, this->dir_hash_table_size + this->dir_table_size + this->file_hash_table_size + this->file_table_size + sizeof(*header));
- fsFileWrite(&f, 0, header, sizeof(*header));
- fsFileWrite(&f, sizeof(*header), metadata, this->dir_hash_table_size + this->dir_table_size + this->file_hash_table_size + this->file_table_size);
- fsFileClose(&f);
- }
- fsFsClose(&sd_fs);
- }
- }
+ /* Try to save metadata to the SD card, to save on memory space. */
+ if (R_SUCCEEDED(Utils::SaveSdFileForAtmosphere(this->title_id, ROMFS_METADATA_FILE_PATH, metadata, metadata_size))) {
+ out_infos->emplace_back(header->dir_hash_table_ofs, metadata_size, RomFSDataSource::MetaData);
+ delete metadata;
+ } else {
+ out_infos->emplace_back(header->dir_hash_table_ofs, metadata_size, metadata, RomFSDataSource::Memory);
+ }
-
- out_infos->emplace_back(header->dir_hash_table_ofs, this->dir_hash_table_size + this->dir_table_size + this->file_hash_table_size + this->file_table_size, metadata, RomFSDataSource::Memory);
}
diff --git a/stratosphere/fs_mitm/source/fsmitm_romfsbuild.hpp b/stratosphere/fs_mitm/source/fsmitm_romfsbuild.hpp
index c4a78e6..4da8b30 100644
--- a/stratosphere/fs_mitm/source/fsmitm_romfsbuild.hpp
+++ b/stratosphere/fs_mitm/source/fsmitm_romfsbuild.hpp
@@ -25,11 +25,14 @@
#define ROMFS_ENTRY_EMPTY 0xFFFFFFFF
#define ROMFS_FILEPARTITION_OFS 0x200
+#define ROMFS_METADATA_FILE_PATH "romfs_metadata.bin"
+
/* Types for RomFS Meta construction. */
enum class RomFSDataSource {
BaseRomFS,
FileRomFS,
LooseFile,
+ MetaData,
Memory,
};
@@ -49,6 +52,10 @@
const u8 *data;
};
+struct RomFSMetaDataSourceInfo {
+
+};
+
struct RomFSSourceInfo {
u64 virtual_offset;
u64 size;
@@ -57,6 +64,7 @@
RomFSFileSourceInfo file_source_info;
RomFSLooseSourceInfo loose_source_info;
RomFSMemorySourceInfo memory_source_info;
+ RomFSMemorySourceInfo metadata_source_info;
};
RomFSDataSource type;
@@ -69,6 +77,7 @@
this->file_source_info.offset = offset;
break;
case RomFSDataSource::LooseFile:
+ case RomFSDataSource::MetaData:
case RomFSDataSource::Memory:
default:
fatalSimple(0xF601);
@@ -83,6 +92,20 @@
case RomFSDataSource::Memory:
this->memory_source_info.data = (decltype(this->memory_source_info.data))arg;
break;
+ case RomFSDataSource::MetaData:
+ case RomFSDataSource::BaseRomFS:
+ case RomFSDataSource::FileRomFS:
+ default:
+ fatalSimple(0xF601);
+ }
+ }
+
+ RomFSSourceInfo(u64 v_o, u64 s, RomFSDataSource t) : virtual_offset(v_o), size(s), type(t) {
+ switch (this->type) {
+ case RomFSDataSource::MetaData:
+ break;
+ case RomFSDataSource::LooseFile:
+ case RomFSDataSource::Memory:
case RomFSDataSource::BaseRomFS:
case RomFSDataSource::FileRomFS:
default:
@@ -94,6 +117,7 @@
switch (this->type) {
case RomFSDataSource::BaseRomFS:
case RomFSDataSource::FileRomFS:
+ case RomFSDataSource::MetaData:
break;
case RomFSDataSource::LooseFile:
delete this->loose_source_info.path;
diff --git a/stratosphere/fs_mitm/source/fsmitm_service.cpp b/stratosphere/fs_mitm/source/fsmitm_service.cpp
index 7cb91f1..91364ae 100644
--- a/stratosphere/fs_mitm/source/fsmitm_service.cpp
+++ b/stratosphere/fs_mitm/source/fsmitm_service.cpp
@@ -14,7 +14,12 @@
* along with this program. If not, see .
*/
+#include