mirror of https://github.com/AxioDL/kabufuda.git
Prevent garbage data from being written to memcard
This commit is contained in:
parent
630119350b
commit
da4008bf50
|
@ -78,24 +78,26 @@ struct CardStat {
|
||||||
class Card {
|
class Card {
|
||||||
#pragma pack(push, 4)
|
#pragma pack(push, 4)
|
||||||
struct CardHeader {
|
struct CardHeader {
|
||||||
uint8_t m_serial[12];
|
union {
|
||||||
uint64_t m_formatTime;
|
struct {
|
||||||
int32_t m_sramBias;
|
uint8_t m_serial[12];
|
||||||
uint32_t m_sramLanguage;
|
uint64_t m_formatTime;
|
||||||
uint32_t m_unknown;
|
int32_t m_sramBias;
|
||||||
uint16_t m_deviceId; /* 0 for Slot A, 1 for Slot B */
|
uint32_t m_sramLanguage;
|
||||||
uint16_t m_sizeMb;
|
uint32_t m_unknown;
|
||||||
uint16_t m_encoding;
|
uint16_t m_deviceId; /* 0 for Slot A, 1 for Slot B */
|
||||||
uint8_t __padding[468];
|
uint16_t m_sizeMb;
|
||||||
uint16_t m_updateCounter;
|
uint16_t m_encoding;
|
||||||
uint16_t m_checksum;
|
uint8_t __padding[468];
|
||||||
uint16_t m_checksumInv;
|
uint16_t m_updateCounter;
|
||||||
|
uint16_t m_checksum;
|
||||||
|
uint16_t m_checksumInv;
|
||||||
|
};
|
||||||
|
uint8_t __raw[BlockSize];
|
||||||
|
};
|
||||||
void _swapEndian();
|
void _swapEndian();
|
||||||
};
|
};
|
||||||
union {
|
CardHeader m_ch;
|
||||||
CardHeader m_ch;
|
|
||||||
uint8_t __raw[BlockSize];
|
|
||||||
};
|
|
||||||
CardHeader m_tmpCh;
|
CardHeader m_tmpCh;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
|
|
@ -24,10 +24,10 @@ void Card::CardHeader::_swapEndian() {
|
||||||
m_checksumInv = SBig(m_checksumInv);
|
m_checksumInv = SBig(m_checksumInv);
|
||||||
}
|
}
|
||||||
|
|
||||||
Card::Card() { memset(__raw, 0xFF, BlockSize); }
|
Card::Card() { memset(m_ch.__raw, 0xFF, BlockSize); }
|
||||||
|
|
||||||
Card::Card(Card&& other) {
|
Card::Card(Card&& other) {
|
||||||
memmove(__raw, other.__raw, BlockSize);
|
memmove(m_ch.__raw, other.m_ch.__raw, BlockSize);
|
||||||
m_filename = std::move(other.m_filename);
|
m_filename = std::move(other.m_filename);
|
||||||
m_fileHandle = std::move(other.m_fileHandle);
|
m_fileHandle = std::move(other.m_fileHandle);
|
||||||
m_dirs[0] = std::move(other.m_dirs[0]);
|
m_dirs[0] = std::move(other.m_dirs[0]);
|
||||||
|
@ -45,7 +45,7 @@ Card::Card(Card&& other) {
|
||||||
Card& Card::operator=(Card&& other) {
|
Card& Card::operator=(Card&& other) {
|
||||||
close();
|
close();
|
||||||
|
|
||||||
memmove(__raw, other.__raw, BlockSize);
|
memmove(m_ch.__raw, other.m_ch.__raw, BlockSize);
|
||||||
m_filename = std::move(other.m_filename);
|
m_filename = std::move(other.m_filename);
|
||||||
m_fileHandle = std::move(other.m_fileHandle);
|
m_fileHandle = std::move(other.m_fileHandle);
|
||||||
m_dirs[0] = std::move(other.m_dirs[0]);
|
m_dirs[0] = std::move(other.m_dirs[0]);
|
||||||
|
@ -107,7 +107,7 @@ ECardResult Card::_pumpOpen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Card::Card(const char* game, const char* maker) {
|
Card::Card(const char* game, const char* maker) {
|
||||||
memset(__raw, 0xFF, BlockSize);
|
memset(m_ch.__raw, 0xFF, BlockSize);
|
||||||
if (game && strlen(game) == 4)
|
if (game && strlen(game) == 4)
|
||||||
memcpy(m_game, game, 4);
|
memcpy(m_game, game, 4);
|
||||||
if (maker && strlen(maker) == 2)
|
if (maker && strlen(maker) == 2)
|
||||||
|
@ -164,7 +164,7 @@ void Card::_updateDirAndBat(const Directory& dir, const BlockAllocationTable& ba
|
||||||
|
|
||||||
void Card::_updateChecksum() {
|
void Card::_updateChecksum() {
|
||||||
m_ch._swapEndian();
|
m_ch._swapEndian();
|
||||||
calculateChecksumBE(reinterpret_cast<uint16_t*>(__raw), 0xFE, &m_ch.m_checksum, &m_ch.m_checksumInv);
|
calculateChecksumBE(reinterpret_cast<uint16_t*>(m_ch.__raw), 0xFE, &m_ch.m_checksum, &m_ch.m_checksumInv);
|
||||||
m_ch._swapEndian();
|
m_ch._swapEndian();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -726,7 +726,7 @@ void Card::getSerial(uint64_t& serial) {
|
||||||
m_ch._swapEndian();
|
m_ch._swapEndian();
|
||||||
uint32_t serialBuf[8];
|
uint32_t serialBuf[8];
|
||||||
for (uint32_t i = 0; i < 8; i++)
|
for (uint32_t i = 0; i < 8; i++)
|
||||||
serialBuf[i] = SBig(*reinterpret_cast<uint32_t*>(__raw + (i * 4)));
|
serialBuf[i] = SBig(*reinterpret_cast<uint32_t*>(m_ch.__raw + (i * 4)));
|
||||||
serial = uint64_t(serialBuf[0] ^ serialBuf[2] ^ serialBuf[4] ^ serialBuf[6]) << 32 |
|
serial = uint64_t(serialBuf[0] ^ serialBuf[2] ^ serialBuf[4] ^ serialBuf[6]) << 32 |
|
||||||
(serialBuf[1] ^ serialBuf[3] ^ serialBuf[5] ^ serialBuf[7]);
|
(serialBuf[1] ^ serialBuf[3] ^ serialBuf[5] ^ serialBuf[7]);
|
||||||
m_ch._swapEndian();
|
m_ch._swapEndian();
|
||||||
|
@ -745,7 +745,7 @@ void Card::getFreeBlocks(int32_t& bytesNotUsed, int32_t& filesNotUsed) {
|
||||||
static std::unique_ptr<uint8_t[]> DummyBlock;
|
static std::unique_ptr<uint8_t[]> DummyBlock;
|
||||||
|
|
||||||
void Card::format(ECardSlot id, ECardSize size, EEncoding encoding) {
|
void Card::format(ECardSlot id, ECardSize size, EEncoding encoding) {
|
||||||
memset(__raw, 0xFF, BlockSize);
|
memset(m_ch.__raw, 0xFF, BlockSize);
|
||||||
uint64_t rand = uint64_t(getGCTime());
|
uint64_t rand = uint64_t(getGCTime());
|
||||||
m_ch.m_formatTime = rand;
|
m_ch.m_formatTime = rand;
|
||||||
for (int i = 0; i < 12; i++) {
|
for (int i = 0; i < 12; i++) {
|
||||||
|
@ -779,7 +779,7 @@ void Card::format(ECardSlot id, ECardSize size, EEncoding encoding) {
|
||||||
m_tmpCh = m_ch;
|
m_tmpCh = m_ch;
|
||||||
m_tmpCh._swapEndian();
|
m_tmpCh._swapEndian();
|
||||||
m_fileHandle.resizeQueue(5 + blockCount);
|
m_fileHandle.resizeQueue(5 + blockCount);
|
||||||
m_fileHandle.asyncWrite(0, &m_tmpCh, BlockSize, 0);
|
m_fileHandle.asyncWrite(0, &m_tmpCh.__raw, BlockSize, 0);
|
||||||
m_tmpDirs[0] = m_dirs[0];
|
m_tmpDirs[0] = m_dirs[0];
|
||||||
m_tmpDirs[0].swapEndian();
|
m_tmpDirs[0].swapEndian();
|
||||||
m_fileHandle.asyncWrite(1, m_tmpDirs[0].__raw, BlockSize, BlockSize * 1);
|
m_fileHandle.asyncWrite(1, m_tmpDirs[0].__raw, BlockSize, BlockSize * 1);
|
||||||
|
@ -842,7 +842,7 @@ bool Card::open(SystemStringView filepath) {
|
||||||
m_fileHandle = AsyncIO(m_filename);
|
m_fileHandle = AsyncIO(m_filename);
|
||||||
if (m_fileHandle) {
|
if (m_fileHandle) {
|
||||||
m_fileHandle.resizeQueue(5);
|
m_fileHandle.resizeQueue(5);
|
||||||
if (!m_fileHandle.asyncRead(0, __raw, BlockSize, 0))
|
if (!m_fileHandle.asyncRead(0, m_ch.__raw, BlockSize, 0))
|
||||||
return false;
|
return false;
|
||||||
if (!m_fileHandle.asyncRead(1, m_dirs[0].__raw, BlockSize, BlockSize * 1))
|
if (!m_fileHandle.asyncRead(1, m_dirs[0].__raw, BlockSize, BlockSize * 1))
|
||||||
return false;
|
return false;
|
||||||
|
@ -880,7 +880,7 @@ ECardResult Card::getError() const {
|
||||||
|
|
||||||
uint16_t ckSum, ckSumInv;
|
uint16_t ckSum, ckSumInv;
|
||||||
const_cast<Card&>(*this).m_ch._swapEndian();
|
const_cast<Card&>(*this).m_ch._swapEndian();
|
||||||
calculateChecksumBE(reinterpret_cast<const uint16_t*>(__raw), 0xFE, &ckSum, &ckSumInv);
|
calculateChecksumBE(reinterpret_cast<const uint16_t*>(m_ch.__raw), 0xFE, &ckSum, &ckSumInv);
|
||||||
bool res = (ckSum == m_ch.m_checksum && ckSumInv == m_ch.m_checksumInv);
|
bool res = (ckSum == m_ch.m_checksum && ckSumInv == m_ch.m_checksumInv);
|
||||||
const_cast<Card&>(*this).m_ch._swapEndian();
|
const_cast<Card&>(*this).m_ch._swapEndian();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue