mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	mii_selector: map raw data to the MiiResult struct
This commit is contained in:
		
							parent
							
								
									6e6c437a52
								
							
						
					
					
						commit
						fe99e5a51e
					
				
					 2 changed files with 65 additions and 23 deletions
				
			
		|  | @ -18,19 +18,6 @@ | ||||||
| namespace HLE { | namespace HLE { | ||||||
| namespace Applets { | namespace Applets { | ||||||
| 
 | 
 | ||||||
| // This data was obtained by writing the returned buffer in AppletManager::GlanceParameter of the
 |  | ||||||
| // LLEd Mii picker of version system version 11.8.0 to a file
 |  | ||||||
| static const std::array<u8, 132> mii = { |  | ||||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x10, |  | ||||||
|     0x30, 0xd2, 0x85, 0xb6, 0xb3, 0x00, 0xc8, 0x85, 0x0a, 0x98, 0x39, 0x1e, 0xe4, 0x40, 0xf4, |  | ||||||
|     0x07, 0xb7, 0x37, 0x10, 0x00, 0x00, 0xa6, 0x00, 0x43, 0x00, 0x69, 0x00, 0x74, 0x00, 0x72, |  | ||||||
|     0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, |  | ||||||
|     0x00, 0x00, 0x21, 0x01, 0x02, 0x68, 0x44, 0x18, 0x26, 0x34, 0x46, 0x14, 0x81, 0x12, 0x17, |  | ||||||
|     0x68, 0x0d, 0x00, 0x00, 0x29, 0x00, 0x52, 0x48, 0x50, 0x66, 0x00, 0x6c, 0x00, 0x54, 0x00, |  | ||||||
|     0x6f, 0x00, 0x62, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
|     0x00, 0x05, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
|     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |  | ||||||
| 
 |  | ||||||
| ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& parameter) { | ResultCode MiiSelector::ReceiveParameter(const Service::APT::MessageParameter& parameter) { | ||||||
|     if (parameter.signal != Service::APT::SignalType::Request) { |     if (parameter.signal != Service::APT::SignalType::Request) { | ||||||
|         LOG_ERROR(Service_APT, "unsupported signal {}", static_cast<u32>(parameter.signal)); |         LOG_ERROR(Service_APT, "unsupported signal {}", static_cast<u32>(parameter.signal)); | ||||||
|  | @ -74,9 +61,39 @@ ResultCode MiiSelector::StartImpl(const Service::APT::AppletStartupParameter& pa | ||||||
| 
 | 
 | ||||||
|     memcpy(&config, parameter.buffer.data(), parameter.buffer.size()); |     memcpy(&config, parameter.buffer.data(), parameter.buffer.size()); | ||||||
| 
 | 
 | ||||||
|     // TODO(Subv): Find more about this structure
 |     // This data was obtained by writing the returned buffer in AppletManager::GlanceParameter of
 | ||||||
|  |     // the LLEd Mii picker of version system version 11.8.0 to a file and then matching the values
 | ||||||
|  |     // to the members of the MiiResult struct
 | ||||||
|  |     MiiData mii_data; | ||||||
|  |     mii_data.mii_id = 0x03001030; | ||||||
|  |     mii_data.system_id = 0xD285B6B300C8850A; | ||||||
|  |     mii_data.specialness_and_creation_date = 0x98391EE4; | ||||||
|  |     mii_data.creator_mac = {0x40, 0xF4, 0x07, 0xB7, 0x37, 0x10}; | ||||||
|  |     mii_data.padding = 0x0; | ||||||
|  |     mii_data.mii_information = 0xA600; | ||||||
|  |     mii_data.mii_name = {'C', 'i', 't', 'r', 'a', 0x0, 0x0, 0x0, 0x0, 0x0}; | ||||||
|  |     mii_data.width_height = 0x4040; | ||||||
|  |     mii_data.appearance_bits1 = 0x0; | ||||||
|  |     mii_data.appearance_bits2 = 0x0; | ||||||
|  |     mii_data.hair_style = 0x21; | ||||||
|  |     mii_data.appearance_bits3 = 0x01; | ||||||
|  |     mii_data.unknown1 = 0x02684418; | ||||||
|  |     mii_data.appearance_bits4 = 0x26; | ||||||
|  |     mii_data.appearance_bits5 = 0x34; | ||||||
|  |     mii_data.appearance_bits6 = 0x4614; | ||||||
|  |     mii_data.unknown2 = 0x81121768; | ||||||
|  |     mii_data.allow_copying = 0x0D; | ||||||
|  |     mii_data.unknown3 = {0x0, 0x0, 0x29, 0x0, 0x52, 0x48, 0x50}; | ||||||
|  |     mii_data.author_name = {'f', 'l', 'T', 'o', 'b', 'i', 0x0, 0x0, 0x0, 0x0}; | ||||||
|  | 
 | ||||||
|     MiiResult result; |     MiiResult result; | ||||||
|     std::memcpy(&result, mii.data(), mii.size()); |     result.return_code = 0x0; | ||||||
|  |     result.is_guest_mii_selected = 0x0; | ||||||
|  |     result.selected_guest_mii_index = 0xFFFFFFFF; | ||||||
|  |     result.selected_mii_data = mii_data; | ||||||
|  |     result.unknown1 = 0x0; | ||||||
|  |     result.mii_data_checksum = 0x056C; | ||||||
|  |     result.guest_mii_name.fill(0x0); | ||||||
| 
 | 
 | ||||||
|     // Let the application know that we're closing
 |     // Let the application know that we're closing
 | ||||||
|     Service::APT::MessageParameter message; |     Service::APT::MessageParameter message; | ||||||
|  |  | ||||||
|  | @ -40,15 +40,40 @@ ASSERT_REG_POSITION(initially_selected_mii_index, 0x90); | ||||||
| ASSERT_REG_POSITION(guest_mii_whitelist, 0x94); | ASSERT_REG_POSITION(guest_mii_whitelist, 0x94); | ||||||
| #undef ASSERT_REG_POSITION | #undef ASSERT_REG_POSITION | ||||||
| 
 | 
 | ||||||
|  | #pragma pack(push, 1) | ||||||
|  | struct MiiData { | ||||||
|  |     u32_be mii_id; | ||||||
|  |     u64_be system_id; | ||||||
|  |     u32_be specialness_and_creation_date; | ||||||
|  |     std::array<u8, 0x6> creator_mac; | ||||||
|  |     u16_be padding; | ||||||
|  |     u16_be mii_information; | ||||||
|  |     std::array<u16_le, 0xA> mii_name; | ||||||
|  |     u16_be width_height; | ||||||
|  |     u8 appearance_bits1; | ||||||
|  |     u8 appearance_bits2; | ||||||
|  |     u8 hair_style; | ||||||
|  |     u8 appearance_bits3; | ||||||
|  |     u32_be unknown1; | ||||||
|  |     u8 appearance_bits4; | ||||||
|  |     u8 appearance_bits5; | ||||||
|  |     u16_be appearance_bits6; | ||||||
|  |     u32_be unknown2; | ||||||
|  |     u8 allow_copying; | ||||||
|  |     std::array<u8, 0x7> unknown3; | ||||||
|  |     std::array<u16_le, 0xA> author_name; | ||||||
|  | }; | ||||||
|  | static_assert(sizeof(MiiData) == 0x5C, "MiiData structure has incorrect size"); | ||||||
|  | #pragma pack(pop) | ||||||
|  | 
 | ||||||
| struct MiiResult { | struct MiiResult { | ||||||
|     u32 return_code; |     u32_be return_code; | ||||||
|     u32 is_guest_mii_selected; |     u32_be is_guest_mii_selected; | ||||||
|     u32 selected_guest_mii_index; |     u32_be selected_guest_mii_index; | ||||||
|     // TODO(mailwl): expand to Mii Format structure: https://www.3dbrew.org/wiki/Mii
 |     MiiData selected_mii_data; | ||||||
|     u8 selected_mii_data[0x5C]; |     u16_be unknown1; | ||||||
|     INSERT_PADDING_BYTES(2); |     u16_be mii_data_checksum; | ||||||
|     u16 mii_data_checksum; |     std::array<u16_le, 0xC> guest_mii_name; | ||||||
|     u16 guest_mii_name[0xC]; |  | ||||||
| }; | }; | ||||||
| static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size"); | static_assert(sizeof(MiiResult) == 0x84, "MiiResult structure has incorrect size"); | ||||||
| #define ASSERT_REG_POSITION(field_name, position)                                                  \ | #define ASSERT_REG_POSITION(field_name, position)                                                  \ | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue