diff --git a/Source/Core/Common/SysConf.cpp b/Source/Core/Common/SysConf.cpp index 4e5e88fb83..422bbb3f2e 100644 --- a/Source/Core/Common/SysConf.cpp +++ b/Source/Core/Common/SysConf.cpp @@ -100,14 +100,15 @@ bool SysConf::LoadFromFile(const std::string& file_name) { u16 data_length = 0; file.ReadBytes(&data_length, sizeof(data_length)); - data.resize(Common::swap16(data_length)); + // The stored u16 is length - 1, not length. + data.resize(Common::swap16(data_length) + 1); break; } case Entry::Type::SmallArray: { u8 data_length = 0; file.ReadBytes(&data_length, sizeof(data_length)); - data.resize(data_length); + data.resize(data_length + 1); break; } case Entry::Type::Byte: @@ -165,20 +166,17 @@ bool SysConf::Save() const case Entry::Type::BigArray: { const u16 data_size = static_cast(item.bytes.size()); - AppendToBuffer(&entries, data_size); + // length - 1 is stored, not length. + AppendToBuffer(&entries, data_size - 1); entries.insert(entries.end(), item.bytes.cbegin(), item.bytes.cbegin() + data_size); - // Unused byte. - entries.insert(entries.end(), '\0'); break; } case Entry::Type::SmallArray: { const u8 data_size = static_cast(item.bytes.size()); - AppendToBuffer(&entries, data_size); + AppendToBuffer(&entries, data_size - 1); entries.insert(entries.end(), item.bytes.cbegin(), item.bytes.cbegin() + data_size); - // Unused byte. - entries.insert(entries.end(), '\0'); break; } @@ -272,22 +270,26 @@ void SysConf::ApplySettingsFromMovie() void SysConf::InsertDefaultEntries() { - AddEntry({Entry::Type::BigArray, "BT.DINF", std::vector(0x460)}); - AddEntry({Entry::Type::BigArray, "BT.CDIF", std::vector(0x204)}); + AddEntry({Entry::Type::BigArray, "BT.DINF", std::vector(0x460 + 1)}); + AddEntry({Entry::Type::BigArray, "BT.CDIF", std::vector(0x204 + 1)}); AddEntry({Entry::Type::Long, "BT.SENS", {0, 0, 0, 3}}); AddEntry({Entry::Type::Byte, "BT.BAR", {1}}); AddEntry({Entry::Type::Byte, "BT.SPKV", {0x58}}); AddEntry({Entry::Type::Byte, "BT.MOT", {1}}); - const std::vector console_nick = {0, 'd', 0, 'o', 0, 'l', 0, 'p', 0, 'h', 0, 'i', 0, 'n'}; + std::vector console_nick = {0, 'd', 0, 'o', 0, 'l', 0, 'p', 0, 'h', 0, 'i', 0, 'n'}; + // 22 bytes: 2 bytes per character (10 characters maximum), + // 1 for a null terminating character, 1 for the string length + console_nick.resize(22); + console_nick[21] = static_cast(strlen("dolphin")); AddEntry({Entry::Type::SmallArray, "IPL.NIK", std::move(console_nick)}); AddEntry({Entry::Type::Byte, "IPL.LNG", {1}}); - std::vector ipl_sadr(0x1007); + std::vector ipl_sadr(0x1007 + 1); ipl_sadr[0] = 0x6c; AddEntry({Entry::Type::BigArray, "IPL.SADR", std::move(ipl_sadr)}); - std::vector ipl_pc(0x50); + std::vector ipl_pc(0x49 + 1); ipl_pc[1] = 0x04; ipl_pc[2] = 0x14; AddEntry({Entry::Type::SmallArray, "IPL.PC", std::move(ipl_pc)}); @@ -305,7 +307,7 @@ void SysConf::InsertDefaultEntries() AddEntry({Entry::Type::Byte, "IPL.DH", {0}}); AddEntry({Entry::Type::Long, "IPL.INC", {0, 0, 0, 8}}); AddEntry({Entry::Type::Long, "IPL.FRC", {0, 0, 0, 0x28}}); - AddEntry({Entry::Type::SmallArray, "IPL.IDL", {0}}); + AddEntry({Entry::Type::SmallArray, "IPL.IDL", {0, 1}}); AddEntry({Entry::Type::Long, "NET.WCFG", {0, 0, 0, 1}}); AddEntry({Entry::Type::Long, "NET.CTPC", std::vector(4)}); diff --git a/Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp b/Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp index ada80f2f17..75e8fef2a0 100644 --- a/Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp +++ b/Source/Core/Core/IOS/USB/Bluetooth/BTBase.cpp @@ -19,11 +19,9 @@ namespace IOS { namespace HLE { -constexpr u16 BT_INFO_SECTION_LENGTH = 0x460; - void BackUpBTInfoSection(const SysConf* sysconf) { - const std::string filename = File::GetUserPath(D_SESSION_WIIROOT_IDX) + DIR_SEP WII_BTDINF_BACKUP; + const std::string filename = File::GetUserPath(D_CONFIG_IDX) + DIR_SEP WII_BTDINF_BACKUP; if (File::Exists(filename)) return; File::IOFile backup(filename, "wb"); @@ -39,18 +37,17 @@ void BackUpBTInfoSection(const SysConf* sysconf) void RestoreBTInfoSection(SysConf* sysconf) { - const std::string filename = File::GetUserPath(D_SESSION_WIIROOT_IDX) + DIR_SEP WII_BTDINF_BACKUP; + const std::string filename = File::GetUserPath(D_CONFIG_IDX) + DIR_SEP WII_BTDINF_BACKUP; File::IOFile backup(filename, "rb"); if (!backup) return; - std::vector section(BT_INFO_SECTION_LENGTH); + auto& section = sysconf->GetOrAddEntry("BT.DINF", SysConf::Entry::Type::BigArray)->bytes; if (!backup.ReadBytes(section.data(), section.size())) { ERROR_LOG(IOS_WIIMOTE, "Failed to read backed up BT.DINF section"); return; } - sysconf->GetOrAddEntry("BT.DINF", SysConf::Entry::Type::BigArray)->bytes = std::move(section); File::Delete(filename); } } // namespace HLE diff --git a/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp b/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp index 98aaf7393f..0761720c9c 100644 --- a/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp +++ b/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.cpp @@ -47,7 +47,7 @@ BluetoothEmu::BluetoothEmu(Kernel& ios, const std::string& device_name) if (!Core::WantsDeterminism()) BackUpBTInfoSection(&sysconf); - _conf_pads BT_DINF; + _conf_pads BT_DINF{}; bdaddr_t tmpBD; u8 i = 0; while (i < MAX_BBMOTES) @@ -78,9 +78,9 @@ BluetoothEmu::BluetoothEmu(Kernel& ios, const std::string& device_name) // save now so that when games load sysconf file it includes the new Wii Remotes // and the correct order for connected Wii Remotes - std::vector data(sizeof(_conf_pads)); - std::memcpy(data.data(), &BT_DINF, data.size()); - sysconf.GetOrAddEntry("BT.DINF", SysConf::Entry::Type::BigArray)->bytes = std::move(data); + auto& section = sysconf.GetOrAddEntry("BT.DINF", SysConf::Entry::Type::BigArray)->bytes; + section.resize(sizeof(_conf_pads)); + std::memcpy(section.data(), &BT_DINF, sizeof(_conf_pads)); if (!sysconf.Save()) PanicAlertT("Failed to write BT.DINF to SYSCONF"); } diff --git a/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.h b/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.h index c772ce6a50..0e6f4d0173 100644 --- a/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.h +++ b/Source/Core/Core/IOS/USB/Bluetooth/BTEmu.h @@ -191,7 +191,7 @@ private: u8 num_registered; _conf_pad_device registered[CONF_PAD_MAX_REGISTERED]; _conf_pad_device active[MAX_BBMOTES]; - u8 unknown[0x45]; + _conf_pad_device unknown; }; #pragma pack(pop) };