bool WiiWAD::ParseWAD(DiscIO::IBlobReader& _rReader) { CBlobBigEndianReader ReaderBig(_rReader); // get header size u32 HeaderSize = ReaderBig.Read32(0); if (HeaderSize != 0x20) { _dbg_assert_msg_(BOOT, (HeaderSize==0x20), "WiiWAD: Header size != 0x20"); return false; } // get header u8 Header[0x20]; _rReader.Read(0, HeaderSize, Header); u32 HeaderType = ReaderBig.Read32(0x4); if ((0x49730000 != HeaderType) && (0x69620000 != HeaderType)) return false; m_CertificateChainSize = ReaderBig.Read32(0x8); u32 Reserved = ReaderBig.Read32(0xC); m_TicketSize = ReaderBig.Read32(0x10); m_TMDSize = ReaderBig.Read32(0x14); m_DataAppSize = ReaderBig.Read32(0x18); m_FooterSize = ReaderBig.Read32(0x1C); #if MAX_LOGLEVEL >= DEBUG_LEVEL _dbg_assert_msg_(BOOT, Reserved==0x00, "WiiWAD: Reserved must be 0x00"); #else (void)Reserved; #endif u32 Offset = 0x40; m_pCertificateChain = CreateWADEntry(_rReader, m_CertificateChainSize, Offset); Offset += ROUND_UP(m_CertificateChainSize, 0x40); m_pTicket = CreateWADEntry(_rReader, m_TicketSize, Offset); Offset += ROUND_UP(m_TicketSize, 0x40); m_pTMD = CreateWADEntry(_rReader, m_TMDSize, Offset); Offset += ROUND_UP(m_TMDSize, 0x40); m_pDataApp = CreateWADEntry(_rReader, m_DataAppSize, Offset); Offset += ROUND_UP(m_DataAppSize, 0x40); m_pFooter = CreateWADEntry(_rReader, m_FooterSize, Offset); Offset += ROUND_UP(m_FooterSize, 0x40); return true; }
bool WiiWAD::ParseWAD(IBlobReader& reader) { CBlobBigEndianReader big_endian_reader(reader); if (!IsWiiWAD(big_endian_reader)) return false; u32 certificate_chain_size; u32 reserved; u32 ticket_size; u32 tmd_size; u32 data_app_size; u32 footer_size; if (!big_endian_reader.ReadSwapped(0x08, &certificate_chain_size) || !big_endian_reader.ReadSwapped(0x0C, &reserved) || !big_endian_reader.ReadSwapped(0x10, &ticket_size) || !big_endian_reader.ReadSwapped(0x14, &tmd_size) || !big_endian_reader.ReadSwapped(0x18, &data_app_size) || !big_endian_reader.ReadSwapped(0x1C, &footer_size)) return false; if (MAX_LOGLEVEL >= LogTypes::LOG_LEVELS::LDEBUG) _dbg_assert_msg_(BOOT, reserved == 0x00, "WiiWAD: Reserved must be 0x00"); u32 offset = 0x40; m_certificate_chain = CreateWADEntry(reader, certificate_chain_size, offset); offset += ROUND_UP(certificate_chain_size, 0x40); m_ticket = CreateWADEntry(reader, ticket_size, offset); offset += ROUND_UP(ticket_size, 0x40); m_tmd = CreateWADEntry(reader, tmd_size, offset); offset += ROUND_UP(tmd_size, 0x40); m_data_app = CreateWADEntry(reader, data_app_size, offset); offset += ROUND_UP(data_app_size, 0x40); m_footer = CreateWADEntry(reader, footer_size, offset); offset += ROUND_UP(footer_size, 0x40); return true; }