Merge pull request #4867 from lioncash/simplify
Boot_WiiWAD: Simplify state_checksum()
This commit is contained in:
commit
cfc909f422
|
@ -2,7 +2,10 @@
|
|||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
#include <memory>
|
||||
#include <numeric>
|
||||
#include <string>
|
||||
|
||||
#include "Common/CommonPaths.h"
|
||||
|
@ -20,19 +23,6 @@
|
|||
#include "DiscIO/Volume.h"
|
||||
#include "DiscIO/VolumeCreator.h"
|
||||
|
||||
static u32 state_checksum(u32* buf, int len)
|
||||
{
|
||||
u32 checksum = 0;
|
||||
len = len >> 2;
|
||||
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
checksum += buf[i];
|
||||
}
|
||||
|
||||
return checksum;
|
||||
}
|
||||
|
||||
struct StateFlags
|
||||
{
|
||||
u32 checksum;
|
||||
|
@ -43,6 +33,17 @@ struct StateFlags
|
|||
u32 unknown[6];
|
||||
};
|
||||
|
||||
static u32 StateChecksum(const StateFlags& flags)
|
||||
{
|
||||
constexpr size_t length_in_bytes = sizeof(StateFlags) - 4;
|
||||
constexpr size_t num_elements = length_in_bytes / sizeof(u32);
|
||||
std::array<u32, num_elements> flag_data;
|
||||
|
||||
std::memcpy(flag_data.data(), &flags.flags, length_in_bytes);
|
||||
|
||||
return std::accumulate(flag_data.cbegin(), flag_data.cend(), 0U);
|
||||
}
|
||||
|
||||
bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
|
||||
{
|
||||
std::string state_filename(Common::GetTitleDataPath(TITLEID_SYSMENU, Common::FROM_SESSION_ROOT) +
|
||||
|
@ -55,7 +56,7 @@ bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
|
|||
state_file.ReadBytes(&state, sizeof(StateFlags));
|
||||
|
||||
state.type = 0x03; // TYPE_RETURN
|
||||
state.checksum = state_checksum((u32*)&state.flags, sizeof(StateFlags) - 4);
|
||||
state.checksum = StateChecksum(state);
|
||||
|
||||
state_file.Seek(0, SEEK_SET);
|
||||
state_file.WriteBytes(&state, sizeof(StateFlags));
|
||||
|
@ -68,7 +69,7 @@ bool CBoot::Boot_WiiWAD(const std::string& _pFilename)
|
|||
memset(&state, 0, sizeof(StateFlags));
|
||||
state.type = 0x03; // TYPE_RETURN
|
||||
state.discstate = 0x01; // DISCSTATE_WII
|
||||
state.checksum = state_checksum((u32*)&state.flags, sizeof(StateFlags) - 4);
|
||||
state.checksum = StateChecksum(state);
|
||||
state_file.WriteBytes(&state, sizeof(StateFlags));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue