ncch_container: choose the first id as extdata id when extended save data access is used
This commit is contained in:
parent
bbf391abb9
commit
8cf1132b2e
@ -585,7 +585,25 @@ Loader::ResultStatus NCCHContainer::ReadExtdataId(u64& extdata_id) {
|
|||||||
return Loader::ResultStatus::ErrorNotUsed;
|
return Loader::ResultStatus::ErrorNotUsed;
|
||||||
|
|
||||||
if (exheader_header.arm11_system_local_caps.storage_info.other_attributes >> 1) {
|
if (exheader_header.arm11_system_local_caps.storage_info.other_attributes >> 1) {
|
||||||
// Extdata id is not present when using extended savedata access
|
// Using extended save data access
|
||||||
|
// There would be multiple possible extdata IDs in this case. The best we can do for now is
|
||||||
|
// guessing that the first one would be the main save.
|
||||||
|
const std::array<u64, 6> extdata_ids{{
|
||||||
|
exheader_header.arm11_system_local_caps.storage_info.extdata_id0.Value(),
|
||||||
|
exheader_header.arm11_system_local_caps.storage_info.extdata_id1.Value(),
|
||||||
|
exheader_header.arm11_system_local_caps.storage_info.extdata_id2.Value(),
|
||||||
|
exheader_header.arm11_system_local_caps.storage_info.extdata_id3.Value(),
|
||||||
|
exheader_header.arm11_system_local_caps.storage_info.extdata_id4.Value(),
|
||||||
|
exheader_header.arm11_system_local_caps.storage_info.extdata_id5.Value(),
|
||||||
|
}};
|
||||||
|
for (u64 id : extdata_ids) {
|
||||||
|
if (id) {
|
||||||
|
// Found a non-zero ID, use it
|
||||||
|
extdata_id = id;
|
||||||
|
return Loader::ResultStatus::Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Loader::ResultStatus::ErrorNotUsed;
|
return Loader::ResultStatus::ErrorNotUsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,9 +125,23 @@ struct ExHeader_SystemInfo {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct ExHeader_StorageInfo {
|
struct ExHeader_StorageInfo {
|
||||||
|
union {
|
||||||
u64_le ext_save_data_id;
|
u64_le ext_save_data_id;
|
||||||
|
// When using extended savedata access
|
||||||
|
// Prefer the ID specified in the most significant bits
|
||||||
|
BitField<40, 20, u64_le> extdata_id3;
|
||||||
|
BitField<20, 20, u64_le> extdata_id4;
|
||||||
|
BitField<0, 20, u64_le> extdata_id5;
|
||||||
|
};
|
||||||
u8 system_save_data_id[8];
|
u8 system_save_data_id[8];
|
||||||
u8 reserved[8];
|
union {
|
||||||
|
u64_le storage_accessible_unique_ids;
|
||||||
|
// When using extended savedata access
|
||||||
|
// Prefer the ID specified in the most significant bits
|
||||||
|
BitField<40, 20, u64_le> extdata_id0;
|
||||||
|
BitField<20, 20, u64_le> extdata_id1;
|
||||||
|
BitField<0, 20, u64_le> extdata_id2;
|
||||||
|
};
|
||||||
u8 access_info[7];
|
u8 access_info[7];
|
||||||
u8 other_attributes;
|
u8 other_attributes;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user