VolumeDirectory.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Copyright 2008 Dolphin Emulator Project
  2. // Licensed under GPLv2+
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <map>
  6. #include <memory>
  7. #include <string>
  8. #include <vector>
  9. #include "Common/CommonTypes.h"
  10. #include "DiscIO/Volume.h"
  11. namespace File { struct FSTEntry; }
  12. //
  13. // --- this volume type is used for reading files directly from the hard drive ---
  14. //
  15. namespace DiscIO
  16. {
  17. class CVolumeDirectory : public IVolume
  18. {
  19. public:
  20. CVolumeDirectory(const std::string& _rDirectory, bool _bIsWii,
  21. const std::string& _rApploader = "", const std::string& _rDOL = "");
  22. ~CVolumeDirectory();
  23. static bool IsValidDirectory(const std::string& _rDirectory);
  24. bool Read(u64 _Offset, u64 _Length, u8* _pBuffer, bool decrypt) const override;
  25. std::string GetUniqueID() const override;
  26. void SetUniqueID(const std::string& _ID);
  27. std::string GetMakerID() const override;
  28. u16 GetRevision() const override { return 0; }
  29. std::string GetInternalName() const override;
  30. std::map<IVolume::ELanguage, std::string> GetNames(bool prefer_long) const override;
  31. void SetName(const std::string&);
  32. u64 GetFSTSize() const override;
  33. std::string GetApploaderDate() const override;
  34. EPlatform GetVolumeType() const override;
  35. ECountry GetCountry() const override;
  36. u64 GetSize() const override;
  37. u64 GetRawSize() const override;
  38. void BuildFST();
  39. private:
  40. static std::string ExtractDirectoryName(const std::string& _rDirectory);
  41. void SetDiskTypeWii();
  42. void SetDiskTypeGC();
  43. bool SetApploader(const std::string& _rApploader);
  44. void SetDOL(const std::string& _rDOL);
  45. // writing to read buffer
  46. void WriteToBuffer(u64 _SrcStartAddress, u64 _SrcLength, const u8* _Src,
  47. u64& _Address, u64& _Length, u8*& _pBuffer) const;
  48. void PadToAddress(u64 _StartAddress, u64& _Address, u64& _Length, u8*& _pBuffer) const;
  49. void Write32(u32 data, u32 offset, std::vector<u8>* const buffer);
  50. // FST creation
  51. void WriteEntryData(u32& entryOffset, u8 type, u32 nameOffset, u64 dataOffset, u64 length);
  52. void WriteEntryName(u32& nameOffset, const std::string& name);
  53. void WriteEntry(const File::FSTEntry& entry, u32& fstOffset, u32& nameOffset, u64& dataOffset, u32 parentEntryNum);
  54. // returns number of entries found in _Directory
  55. u64 AddDirectoryEntries(const std::string& _Directory, File::FSTEntry& parentEntry);
  56. std::string m_rootDirectory;
  57. std::map<u64, std::string> m_virtualDisk;
  58. u32 m_totalNameSize;
  59. bool m_is_wii;
  60. // GameCube has no shift, Wii has 2 bit shift
  61. u32 m_addressShift;
  62. // first address on disk containing file data
  63. u64 m_dataStartAddress;
  64. u64 m_fstNameOffset;
  65. std::vector<u8> m_FSTData;
  66. std::vector<u8> m_diskHeader;
  67. #pragma pack(push, 1)
  68. struct SDiskHeaderInfo
  69. {
  70. u32 debug_mntr_size;
  71. u32 simulated_mem_size;
  72. u32 arg_offset;
  73. u32 debug_flag;
  74. u32 track_location;
  75. u32 track_size;
  76. u32 country_code;
  77. u32 unknown;
  78. u32 unknown2;
  79. // All the data is byteswapped
  80. SDiskHeaderInfo()
  81. {
  82. debug_mntr_size = 0;
  83. simulated_mem_size = 0;
  84. arg_offset = 0;
  85. debug_flag = 0;
  86. track_location = 0;
  87. track_size = 0;
  88. country_code = 0;
  89. unknown = 0;
  90. unknown2 = 0;
  91. }
  92. };
  93. #pragma pack(pop)
  94. std::unique_ptr<SDiskHeaderInfo> m_diskHeaderInfo;
  95. std::vector<u8> m_apploader;
  96. std::vector<u8> m_DOL;
  97. u64 m_fst_address;
  98. u64 m_dol_address;
  99. static const u8 ENTRY_SIZE = 0x0c;
  100. static const u8 FILE_ENTRY = 0;
  101. static const u8 DIRECTORY_ENTRY = 1;
  102. static const u64 DISKHEADER_ADDRESS = 0;
  103. static const u64 DISKHEADERINFO_ADDRESS = 0x440;
  104. static const u64 APPLOADER_ADDRESS = 0x2440;
  105. static const u32 MAX_NAME_LENGTH = 0x3df;
  106. };
  107. } // namespace