diff --git a/include/NOD/DiscBase.hpp b/include/NOD/DiscBase.hpp index 8eb3dcc..20fe567 100644 --- a/include/NOD/DiscBase.hpp +++ b/include/NOD/DiscBase.hpp @@ -58,6 +58,19 @@ public: PART_UPDATE, 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 { public: diff --git a/lib/DiscBase.cpp b/lib/DiscBase.cpp index c32f81d..d84b4ba 100644 --- a/lib/DiscBase.cpp +++ b/lib/DiscBase.cpp @@ -95,6 +95,27 @@ void DiscBase::IPartition::extractToDirectory(const SystemString& path, bool for ws->write(buf.get(), m_apploaderSz); } + /* Extract Dol */ + SystemString dolPath = path + _S("/main.dol"); + if (force || Stat(dolPath.c_str(), &theStat)) + { + std::unique_ptr rs = beginReadStream(m_dolOff); + /* Read Dol header */ + DOLHeader hdr; + rs->read(&hdr, sizeof(DOLHeader)); + std::unique_ptr 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 buf(new uint8_t[dolSize]); + rs->read(buf.get(), dolSize); + ws->write(buf.get(), dolSize); + } + /* Extract Filesystem */ m_nodes[0].extractToDirectory(path, force); }