CARCFile::CARCFile(const std::string& _rFilename, u32 offset) : m_pBuffer(NULL) , m_Initialized(false) { DiscIO::IBlobReader* pReader = DiscIO::CreateBlobReader(_rFilename.c_str()); if (pReader != NULL) { u64 FileSize = pReader->GetDataSize() - offset; m_pBuffer = new u8[(u32)FileSize]; pReader->Read(offset, FileSize, m_pBuffer); delete pReader; m_Initialized = ParseBuffer(); } }
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; }