diff options
| author | JosJuice <josjuice@gmail.com> | 2017-06-10 11:54:41 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2017-08-01 11:36:40 +0200 |
| commit | ef39b4da4611169bab695d3943df794430cd7c45 (patch) | |
| tree | 7901ecaf9482f194fc62382e2a6e6a1f8174beb0 /Source/Core/DiscIO/DirectoryBlob.cpp | |
| parent | 31d8322c5a0732ae631ee6f8226c6b7c5527cff5 (diff) | |
DirectoryBlob: Improve SetApploader
The code gets simpler by using IOFile instead of ReadFileToString.
Also, we now write -1 in all cases where loading fails.
Diffstat (limited to 'Source/Core/DiscIO/DirectoryBlob.cpp')
| -rw-r--r-- | Source/Core/DiscIO/DirectoryBlob.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/Source/Core/DiscIO/DirectoryBlob.cpp b/Source/Core/DiscIO/DirectoryBlob.cpp index 7243d23b97..004cc46a82 100644 --- a/Source/Core/DiscIO/DirectoryBlob.cpp +++ b/Source/Core/DiscIO/DirectoryBlob.cpp @@ -167,7 +167,7 @@ DirectoryBlobReader::DirectoryBlobReader(const std::string& root_directory) AddFileToContents(&m_virtual_disc, m_root_directory + "sys/bi2.bin", BI2_ADDRESS, BI2_SIZE); - BuildFST(SetDOL(SetApploader(m_root_directory + "sys/apploader.img"))); + BuildFST(SetDOL(SetApploader())); if (m_is_wii) { @@ -330,35 +330,32 @@ void DirectoryBlobReader::SetTMDAndTicket() reinterpret_cast<const u8*>(&m_tmd_header)); } -u64 DirectoryBlobReader::SetApploader(const std::string& apploader) +u64 DirectoryBlobReader::SetApploader() { - if (apploader.empty()) + bool success = false; + + const std::string path = m_root_directory + "sys/apploader.img"; + File::IOFile file(path, "rb"); + m_apploader.resize(file.GetSize()); + if (m_apploader.size() < 0x20 || !file.ReadBytes(m_apploader.data(), m_apploader.size())) { - m_apploader.resize(0x20); - // Make sure BS2 HLE doesn't try to run the apploader - Write32(static_cast<u32>(-1), 0x10, &m_apploader); + ERROR_LOG(DISCIO, "%s couldn't be accessed or is too small", path.c_str()); } else { - std::string data; - if (!File::ReadFileToString(apploader, data)) - { - PanicAlertT("Apploader unable to load from file"); - } + const size_t apploader_size = 0x20 + Common::swap32(*(u32*)&m_apploader[0x14]) + + Common::swap32(*(u32*)&m_apploader[0x18]); + if (apploader_size != m_apploader.size()) + ERROR_LOG(DISCIO, "%s is the wrong size... Is it really an apploader?", path.c_str()); else - { - const size_t apploader_size = 0x20 + Common::swap32(*(u32*)&data.data()[0x14]) + - Common::swap32(*(u32*)&data.data()[0x18]); - if (apploader_size != data.size()) - { - PanicAlertT("Apploader is the wrong size...is it really an apploader?"); - } - else - { - m_apploader.resize(apploader_size); - std::copy(data.begin(), data.end(), m_apploader.begin()); - } - } + success = true; + } + + if (!success) + { + m_apploader.resize(0x20); + // Make sure BS2 HLE doesn't try to run the apploader + Write32(static_cast<u32>(-1), 0x10, &m_apploader); } m_virtual_disc.emplace(APPLOADER_ADDRESS, m_apploader.size(), m_apploader.data()); |
