diff options
| author | LPFaint99 <lpfaint99@gmail.com> | 2009-07-03 22:34:51 +0000 |
|---|---|---|
| committer | LPFaint99 <lpfaint99@gmail.com> | 2009-07-03 22:34:51 +0000 |
| commit | 4c86d218c1c55be7849fbe23b0903c8991f35b3c (patch) | |
| tree | c4e436b57e6e6357c5527bfd3a65eaae410f229f /Source/Core/DiscIO/Src/NANDContentLoader.cpp | |
| parent | 15e4eed7fa6e20fc4fed13960699670e94045467 (diff) | |
Add Taiwan to the Country Codes, move all country code switches to one function, add unk country flag and taiwan country flag
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3666 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/DiscIO/Src/NANDContentLoader.cpp')
| -rw-r--r-- | Source/Core/DiscIO/Src/NANDContentLoader.cpp | 432 |
1 files changed, 188 insertions, 244 deletions
diff --git a/Source/Core/DiscIO/Src/NANDContentLoader.cpp b/Source/Core/DiscIO/Src/NANDContentLoader.cpp index 4f89f56090..0815e3d9fd 100644 --- a/Source/Core/DiscIO/Src/NANDContentLoader.cpp +++ b/Source/Core/DiscIO/Src/NANDContentLoader.cpp @@ -31,48 +31,48 @@ namespace DiscIO class CSharedContent -{ +{ public: - - static CSharedContent& AccessInstance() { return m_Instance; } - std::string GetFilenameFromSHA1(u8* _pHash); + static CSharedContent& AccessInstance() { return m_Instance; } + + std::string GetFilenameFromSHA1(u8* _pHash); private: - CSharedContent(); + CSharedContent(); - virtual ~CSharedContent(); + virtual ~CSharedContent(); - struct SElement - { - u8 FileName[8]; - u8 SHA1Hash[20]; - }; + struct SElement + { + u8 FileName[8]; + u8 SHA1Hash[20]; + }; - std::vector<SElement> m_Elements; - static CSharedContent m_Instance; + std::vector<SElement> m_Elements; + static CSharedContent m_Instance; }; CSharedContent CSharedContent::m_Instance; CSharedContent::CSharedContent() { - char szFilename[1024]; - sprintf(szFilename, "%sshared1/content.map", FULL_WII_USER_DIR); - if (File::Exists(szFilename)) - { - FILE* pFile = fopen(szFilename, "rb"); - while(!feof(pFile)) - { - SElement Element; - if (fread(&Element, sizeof(SElement), 1, pFile) == 1) - { - m_Elements.push_back(Element); - } - } - } + char szFilename[1024]; + sprintf(szFilename, "%sshared1/content.map", FULL_WII_USER_DIR); + if (File::Exists(szFilename)) + { + FILE* pFile = fopen(szFilename, "rb"); + while(!feof(pFile)) + { + SElement Element; + if (fread(&Element, sizeof(SElement), 1, pFile) == 1) + { + m_Elements.push_back(Element); + } + } + } } CSharedContent::~CSharedContent() @@ -80,18 +80,18 @@ CSharedContent::~CSharedContent() std::string CSharedContent::GetFilenameFromSHA1(u8* _pHash) { - for (size_t i=0; i<m_Elements.size(); i++) - { - if (memcmp(_pHash, m_Elements[i].SHA1Hash, 20) == 0) - { - char szFilename[1024]; - sprintf(szFilename, "%sshared1/%c%c%c%c%c%c%c%c.app", FULL_WII_USER_DIR, - m_Elements[i].FileName[0], m_Elements[i].FileName[1], m_Elements[i].FileName[2], m_Elements[i].FileName[3], - m_Elements[i].FileName[4], m_Elements[i].FileName[5], m_Elements[i].FileName[6], m_Elements[i].FileName[7]); - return szFilename; - } - } - return "unk"; + for (size_t i=0; i<m_Elements.size(); i++) + { + if (memcmp(_pHash, m_Elements[i].SHA1Hash, 20) == 0) + { + char szFilename[1024]; + sprintf(szFilename, "%sshared1/%c%c%c%c%c%c%c%c.app", FULL_WII_USER_DIR, + m_Elements[i].FileName[0], m_Elements[i].FileName[1], m_Elements[i].FileName[2], m_Elements[i].FileName[3], + m_Elements[i].FileName[4], m_Elements[i].FileName[5], m_Elements[i].FileName[6], m_Elements[i].FileName[7]); + return szFilename; + } + } + return "unk"; } @@ -101,89 +101,89 @@ class CNANDContentLoader : public INANDContentLoader { public: - CNANDContentLoader(const std::string& _rName); + CNANDContentLoader(const std::string& _rName); - virtual ~CNANDContentLoader(); + virtual ~CNANDContentLoader(); - bool IsValid() const { return m_Valid; } - u64 GetTitleID() const { return m_TitleID; } + bool IsValid() const { return m_Valid; } + u64 GetTitleID() const { return m_TitleID; } u16 GetIosVersion() const { return m_IosVersion; } - u32 GetBootIndex() const { return m_BootIndex; } - size_t GetContentSize() const { return m_Content.size(); } - const SNANDContent* GetContentByIndex(int _Index) const; - const u8* GetTicketView() const { return m_TicketView; } - const u8* GetTmdHeader() const { return m_TmdHeader; } + u32 GetBootIndex() const { return m_BootIndex; } + size_t GetContentSize() const { return m_Content.size(); } + const SNANDContent* GetContentByIndex(int _Index) const; + const u8* GetTicketView() const { return m_TicketView; } + const u8* GetTmdHeader() const { return m_TmdHeader; } - const std::vector<SNANDContent>& GetContent() const { return m_Content; } + const std::vector<SNANDContent>& GetContent() const { return m_Content; } - const u16 GetTitleVersion() const {return m_TileVersion;} - const u16 GetNumEntries() const {return m_numEntries;} - const DiscIO::IVolume::ECountry GetCountry() const; + const u16 GetTitleVersion() const {return m_TileVersion;} + const u16 GetNumEntries() const {return m_numEntries;} + const DiscIO::IVolume::ECountry GetCountry() const; private: - bool m_Valid; - u64 m_TitleID; + bool m_Valid; + u64 m_TitleID; u16 m_IosVersion; - u32 m_BootIndex; - u16 m_numEntries; - u16 m_TileVersion; - u8 m_TicketView[TICKET_VIEW_SIZE]; + u32 m_BootIndex; + u16 m_numEntries; + u16 m_TileVersion; + u8 m_TicketView[TICKET_VIEW_SIZE]; u8 m_TmdHeader[TMD_HEADER_SIZE]; - std::vector<SNANDContent> m_Content; + std::vector<SNANDContent> m_Content; - bool CreateFromDirectory(const std::string& _rPath); - bool CreateFromWAD(const std::string& _rName); + bool CreateFromDirectory(const std::string& _rPath); + bool CreateFromWAD(const std::string& _rName); - void AESDecode(u8* _pKey, u8* _IV, u8* _pSrc, u32 _Size, u8* _pDest); + void AESDecode(u8* _pKey, u8* _IV, u8* _pSrc, u32 _Size, u8* _pDest); - void GetKeyFromTicket(u8* pTicket, u8* pTicketKey); + void GetKeyFromTicket(u8* pTicket, u8* pTicketKey); - bool ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u8* pTMD); + bool ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u8* pTMD); }; CNANDContentLoader::CNANDContentLoader(const std::string& _rName) - : m_TitleID(-1) - , m_BootIndex(-1) - , m_Valid(false) + : m_TitleID(-1) + , m_BootIndex(-1) + , m_Valid(false) , m_IosVersion(0x09) { - if (File::IsDirectory(_rName.c_str())) - { - m_Valid = CreateFromDirectory(_rName); - } - else if (File::Exists(_rName.c_str())) - { - m_Valid = CreateFromWAD(_rName); - } - else - { -// _dbg_assert_msg_(BOOT, 0, "CNANDContentLoader loads neither folder nor file"); - } + if (File::IsDirectory(_rName.c_str())) + { + m_Valid = CreateFromDirectory(_rName); + } + else if (File::Exists(_rName.c_str())) + { + m_Valid = CreateFromWAD(_rName); + } + else + { +// _dbg_assert_msg_(BOOT, 0, "CNANDContentLoader loads neither folder nor file"); + } } CNANDContentLoader::~CNANDContentLoader() { - for (size_t i=0; i<m_Content.size(); i++) - { - delete [] m_Content[i].m_pData; - } - m_Content.clear(); + for (size_t i=0; i<m_Content.size(); i++) + { + delete [] m_Content[i].m_pData; + } + m_Content.clear(); } const SNANDContent* CNANDContentLoader::GetContentByIndex(int _Index) const { - for (size_t i=0; i<m_Content.size(); i++) - { - if (m_Content[i].m_Index == _Index) - return &m_Content[i]; - } - return NULL; + for (size_t i=0; i<m_Content.size(); i++) + { + if (m_Content[i].m_Index == _Index) + return &m_Content[i]; + } + return NULL; } bool CNANDContentLoader::CreateFromWAD(const std::string& _rName) @@ -197,93 +197,93 @@ bool CNANDContentLoader::CreateFromWAD(const std::string& _rName) bool CNANDContentLoader::CreateFromDirectory(const std::string& _rPath) { - std::string TMDFileName(_rPath); + std::string TMDFileName(_rPath); TMDFileName += "/title.tmd"; - FILE* pTMDFile = fopen(TMDFileName.c_str(), "rb"); - if (pTMDFile == NULL) { + FILE* pTMDFile = fopen(TMDFileName.c_str(), "rb"); + if (pTMDFile == NULL) { ERROR_LOG(DISCIO, "CreateFromDirectory: error opening %s", TMDFileName.c_str()); - return false; + return false; } - u64 Size = File::GetSize(TMDFileName.c_str()); - u8* pTMD = new u8[(u32)Size]; - fread(pTMD, (size_t)Size, 1, pTMDFile); - fclose(pTMDFile); + u64 Size = File::GetSize(TMDFileName.c_str()); + u8* pTMD = new u8[(u32)Size]; + fread(pTMD, (size_t)Size, 1, pTMDFile); + fclose(pTMDFile); - memcpy(m_TicketView, pTMD + 0x180, TICKET_VIEW_SIZE); + memcpy(m_TicketView, pTMD + 0x180, TICKET_VIEW_SIZE); memcpy(m_TmdHeader, pTMD, TMD_HEADER_SIZE); - ////// - m_TileVersion = Common::swap16(pTMD + 0x01dc); - m_numEntries = Common::swap16(pTMD + 0x01de); - m_BootIndex = Common::swap16(pTMD + 0x01e0); - m_TitleID = Common::swap64(pTMD + 0x018c); - m_IosVersion = Common::swap16(pTMD + 0x018a); - - m_Content.resize(m_numEntries); - - for (u32 i = 0; i < m_numEntries; i++) - { - SNANDContent& rContent = m_Content[i]; - - rContent.m_ContentID = Common::swap32(pTMD + 0x01e4 + 0x24*i); - rContent.m_Index = Common::swap16(pTMD + 0x01e8 + 0x24*i); - rContent.m_Type = Common::swap16(pTMD + 0x01ea + 0x24*i); - rContent.m_Size = (u32)Common::swap64(pTMD + 0x01ec + 0x24*i); - memcpy(rContent.m_SHA1Hash, pTMD + 0x01f4 + 0x24*i, 20); - memcpy(rContent.m_Header, pTMD + 0x01e4 + 0x24*i, 36); - - rContent.m_pData = NULL; - char szFilename[1024]; - - if (rContent.m_Type & 0x8000) // shared app - { - std::string Filename = CSharedContent::AccessInstance().GetFilenameFromSHA1(rContent.m_SHA1Hash); - strcpy(szFilename, Filename.c_str()); - } - else - { - sprintf(szFilename, "%s/%08x.app", _rPath.c_str(), rContent.m_ContentID); - } - - INFO_LOG(DISCIO, "NANDContentLoader: load %s", szFilename); - - FILE* pFile = fopen(szFilename, "rb"); - if (pFile != NULL) - { - u64 Size = File::GetSize(szFilename); - rContent.m_pData = new u8[(u32)Size]; - - _dbg_assert_msg_(BOOT, rContent.m_Size==Size, "TMDLoader: Filesize doesnt fit (%s %i)... prolly you have a bad dump", szFilename, i); - - fread(rContent.m_pData, (size_t)Size, 1, pFile); - fclose(pFile); - } - else - { + ////// + m_TileVersion = Common::swap16(pTMD + 0x01dc); + m_numEntries = Common::swap16(pTMD + 0x01de); + m_BootIndex = Common::swap16(pTMD + 0x01e0); + m_TitleID = Common::swap64(pTMD + 0x018c); + m_IosVersion = Common::swap16(pTMD + 0x018a); + + m_Content.resize(m_numEntries); + + for (u32 i = 0; i < m_numEntries; i++) + { + SNANDContent& rContent = m_Content[i]; + + rContent.m_ContentID = Common::swap32(pTMD + 0x01e4 + 0x24*i); + rContent.m_Index = Common::swap16(pTMD + 0x01e8 + 0x24*i); + rContent.m_Type = Common::swap16(pTMD + 0x01ea + 0x24*i); + rContent.m_Size = (u32)Common::swap64(pTMD + 0x01ec + 0x24*i); + memcpy(rContent.m_SHA1Hash, pTMD + 0x01f4 + 0x24*i, 20); + memcpy(rContent.m_Header, pTMD + 0x01e4 + 0x24*i, 36); + + rContent.m_pData = NULL; + char szFilename[1024]; + + if (rContent.m_Type & 0x8000) // shared app + { + std::string Filename = CSharedContent::AccessInstance().GetFilenameFromSHA1(rContent.m_SHA1Hash); + strcpy(szFilename, Filename.c_str()); + } + else + { + sprintf(szFilename, "%s/%08x.app", _rPath.c_str(), rContent.m_ContentID); + } + + INFO_LOG(DISCIO, "NANDContentLoader: load %s", szFilename); + + FILE* pFile = fopen(szFilename, "rb"); + if (pFile != NULL) + { + u64 Size = File::GetSize(szFilename); + rContent.m_pData = new u8[(u32)Size]; + + _dbg_assert_msg_(BOOT, rContent.m_Size==Size, "TMDLoader: Filesize doesnt fit (%s %i)... prolly you have a bad dump", szFilename, i); + + fread(rContent.m_pData, (size_t)Size, 1, pFile); + fclose(pFile); + } + else + { PanicAlert("NANDContentLoader: error opening %s", szFilename); } - } + } - return true; + return true; } void CNANDContentLoader::AESDecode(u8* _pKey, u8* _IV, u8* _pSrc, u32 _Size, u8* _pDest) { - AES_KEY AESKey; + AES_KEY AESKey; - AES_set_decrypt_key(_pKey, 128, &AESKey); - AES_cbc_encrypt(_pSrc, _pDest, _Size, &AESKey, _IV, AES_DECRYPT); + AES_set_decrypt_key(_pKey, 128, &AESKey); + AES_cbc_encrypt(_pSrc, _pDest, _Size, &AESKey, _IV, AES_DECRYPT); } void CNANDContentLoader::GetKeyFromTicket(u8* pTicket, u8* pTicketKey) { u8 CommonKey[16] = {0xeb,0xe4,0x2a,0x22,0x5e,0x85,0x93,0xe4,0x48,0xd9,0xc5,0x45,0x73,0x81,0xaa,0xf7}; - u8 IV[16]; - memset(IV, 0, sizeof IV); - memcpy(IV, pTicket + 0x01dc, 8); - AESDecode(CommonKey, IV, pTicket + 0x01bf, 16, pTicketKey); + u8 IV[16]; + memset(IV, 0, sizeof IV); + memcpy(IV, pTicket + 0x01dc, 8); + AESDecode(CommonKey, IV, pTicket + 0x01bf, 16, pTicketKey); } bool CNANDContentLoader::ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u8* pTMD) @@ -293,11 +293,11 @@ bool CNANDContentLoader::ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u GetKeyFromTicket(pTicket, DecryptTitleKey); - memcpy(m_TicketView, pTMD + 0x180, TICKET_VIEW_SIZE); + memcpy(m_TicketView, pTMD + 0x180, TICKET_VIEW_SIZE); memcpy(m_TmdHeader, pTMD, TMD_HEADER_SIZE); - m_TileVersion = Common::swap16(pTMD + 0x01dc); - m_numEntries = Common::swap16(pTMD + 0x01de); + m_TileVersion = Common::swap16(pTMD + 0x01dc); + m_numEntries = Common::swap16(pTMD + 0x01de); m_BootIndex = Common::swap16(pTMD + 0x01e0); m_TitleID = Common::swap64(pTMD + 0x018c); m_IosVersion = Common::swap16(pTMD + 0x018a); @@ -313,11 +313,11 @@ bool CNANDContentLoader::ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u rContent.m_ContentID = Common::swap32(pTMD + 0x01e4 + 0x24*i); rContent.m_Index = Common::swap16(pTMD + 0x01e8 + 0x24*i); rContent.m_Type = Common::swap16(pTMD + 0x01ea + 0x24*i); - rContent.m_Size= (u32)Common::swap64(pTMD + 0x01ec + 0x24*i); - memcpy(rContent.m_SHA1Hash, pTMD + 0x01f4 + 0x24*i, 20); - memcpy(rContent.m_Header, pTMD + 0x01e4 + 0x24*i, 36); + rContent.m_Size= (u32)Common::swap64(pTMD + 0x01ec + 0x24*i); + memcpy(rContent.m_SHA1Hash, pTMD + 0x01f4 + 0x24*i, 20); + memcpy(rContent.m_Header, pTMD + 0x01e4 + 0x24*i, 36); - u32 RoundedSize = ROUND_UP(rContent.m_Size, 0x40); + u32 RoundedSize = ROUND_UP(rContent.m_Size, 0x40); rContent.m_pData = new u8[RoundedSize]; memset(IV, 0, sizeof IV); @@ -327,71 +327,22 @@ bool CNANDContentLoader::ParseTMD(u8* pDataApp, u32 pDataAppSize, u8* pTicket, u p += RoundedSize; } - return true; + return true; } const DiscIO::IVolume::ECountry CNANDContentLoader::GetCountry() const { - DiscIO::IVolume::ECountry country = DiscIO::IVolume::COUNTRY_UNKNOWN; - - if (IsValid()) - { - u64 TitleID = GetTitleID(); - char* pTitleID = (char*)&TitleID; - - switch (pTitleID[0]) - { - case 'S': - country = DiscIO::IVolume::COUNTRY_EUROPE; - break; // PAL // <- that is shitty :) zelda demo disc - - case 'P': - country = DiscIO::IVolume::COUNTRY_EUROPE; - break; // PAL - - case 'D': - country = DiscIO::IVolume::COUNTRY_EUROPE; - break; // PAL - - case 'F': - country = DiscIO::IVolume::COUNTRY_FRANCE; - break; // PAL - - case 'I': - country = DiscIO::IVolume::COUNTRY_ITALY; - break; // PAL - - case 'X': - country = DiscIO::IVolume::COUNTRY_EUROPE; - break; // XIII <- uses X but is PAL rip - - case 'E': - country = DiscIO::IVolume::COUNTRY_USA; - break; // USA - - case 'J': - country = DiscIO::IVolume::COUNTRY_JAP; - break; // JAP - - case 'K': - country = DiscIO::IVolume::COUNTRY_KOR; - break; // KOR - - case 'O': - country = DiscIO::IVolume::COUNTRY_UNKNOWN; - break; // SDK - - default: - PanicAlert("Unknown Country Code!"); - break; - } - } - - return(country); -} + if (!IsValid()) + return DiscIO::IVolume::COUNTRY_UNKNOWN; + + u64 TitleID = GetTitleID(); + char* pTitleID = (char*)&TitleID; + return CountrySwitch((u8)pTitleID[0]); + + +} -/////////////////// CNANDContentManager CNANDContentManager::m_Instance; @@ -399,37 +350,30 @@ CNANDContentManager CNANDContentManager::m_Instance; CNANDContentManager::~CNANDContentManager() { - CNANDContentMap::iterator itr = m_Map.begin(); - while (itr != m_Map.end()) - { - delete itr->second; - itr++; - } - m_Map.clear(); + CNANDContentMap::iterator itr = m_Map.begin(); + while (itr != m_Map.end()) + { + delete itr->second; + itr++; + } + m_Map.clear(); } const INANDContentLoader& CNANDContentManager::GetNANDLoader(const std::string& _rName) { - std::string KeyString(_rName); + std::string KeyString(_rName); - std::transform(KeyString.begin(), KeyString.end(), KeyString.begin(), - (int(*)(int)) toupper); + std::transform(KeyString.begin(), KeyString.end(), KeyString.begin(), + (int(*)(int)) toupper); - CNANDContentMap::iterator itr = m_Map.find(KeyString); - if (itr != m_Map.end()) - return *itr->second; + CNANDContentMap::iterator itr = m_Map.find(KeyString); + if (itr != m_Map.end()) + return *itr->second; - m_Map[KeyString] = new CNANDContentLoader(KeyString); - return *m_Map[KeyString]; + m_Map[KeyString] = new CNANDContentLoader(KeyString); + return *m_Map[KeyString]; } - - - - - } // namespace end - - |
