This commit is contained in:
Jack Andersen 2015-07-03 12:40:47 -10:00
commit 602c54541a
2 changed files with 35 additions and 1 deletions

View File

@ -58,6 +58,19 @@ public:
PART_UPDATE, PART_UPDATE,
PART_CHANNEL PART_CHANNEL
}; };
struct DOLHeader
{
uint32_t textOff[7];
uint32_t dataOff[11];
uint32_t textStarts[7];
uint32_t dataStarts[11];
uint32_t textSizes[7];
uint32_t dataSizes[11];
uint32_t bssStart;
uint32_t bssSize;
uint32_t entryPoint;
};
class Node class Node
{ {
public: public:

View File

@ -86,10 +86,31 @@ void DiscBase::IPartition::extractToDirectory(const SystemString& path, bool for
std::unique_ptr<uint8_t[]> buf(new uint8_t[m_apploaderSz]); std::unique_ptr<uint8_t[]> buf(new uint8_t[m_apploaderSz]);
std::unique_ptr<IPartReadStream> rs = beginReadStream(0x2440); std::unique_ptr<IPartReadStream> rs = beginReadStream(0x2440);
rs->read(buf.get(), m_apploaderSz); rs->read(buf.get(), m_apploaderSz);
std::unique_ptr<IFileIO::IWriteStream> ws = NewFileIO(path + _S("/apploader.bin"))->beginWriteStream(); std::unique_ptr<IFileIO::IWriteStream> ws = NewFileIO(apploaderPath)->beginWriteStream();
ws->write(buf.get(), m_apploaderSz); ws->write(buf.get(), m_apploaderSz);
} }
/* Extract Dol */
SystemString dolPath = path + _S("/main.dol");
if (force || Stat(dolPath.c_str(), &theStat))
{
std::unique_ptr<IPartReadStream> rs = beginReadStream(m_dolOff);
/* Read Dol header */
DOLHeader hdr;
rs->read(&hdr, sizeof(DOLHeader));
std::unique_ptr<IFileIO::IWriteStream> ws = NewFileIO(dolPath)->beginWriteStream();
ws->write(&hdr, sizeof(DOLHeader));
/* Calculate Dol size */
uint32_t dolSize = SBig(hdr.textOff[0]);
for (uint32_t i = 0 ; i < 7 ; i++)
dolSize += SBig(hdr.textSizes[i]);
for (uint32_t i = 0 ; i < 11 ; i++)
dolSize += SBig(hdr.dataSizes[i]);
std::unique_ptr<uint8_t[]> buf(new uint8_t[dolSize]);
rs->read(buf.get(), dolSize);
ws->write(buf.get(), dolSize);
}
/* Extract Filesystem */ /* Extract Filesystem */
m_nodes[0].extractToDirectory(path, force); m_nodes[0].extractToDirectory(path, force);
} }