Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}