card_image.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <array>
  6. #include <memory>
  7. #include <vector>
  8. #include "common/common_types.h"
  9. #include "common/swap.h"
  10. #include "core/file_sys/vfs.h"
  11. namespace Loader {
  12. enum class ResultStatus : u16;
  13. }
  14. namespace FileSys {
  15. class NCA;
  16. enum class NCAContentType : u8;
  17. class NSP;
  18. enum class GamecardSize : u8 {
  19. S_1GB = 0xFA,
  20. S_2GB = 0xF8,
  21. S_4GB = 0xF0,
  22. S_8GB = 0xE0,
  23. S_16GB = 0xE1,
  24. S_32GB = 0xE2,
  25. };
  26. struct GamecardInfo {
  27. std::array<u8, 0x70> data;
  28. };
  29. static_assert(sizeof(GamecardInfo) == 0x70, "GamecardInfo has incorrect size.");
  30. struct GamecardHeader {
  31. std::array<u8, 0x100> signature;
  32. u32_le magic;
  33. u32_le secure_area_start;
  34. u32_le backup_area_start;
  35. u8 kek_index;
  36. GamecardSize size;
  37. u8 header_version;
  38. u8 flags;
  39. u64_le package_id;
  40. u64_le valid_data_end;
  41. u128 info_iv;
  42. u64_le hfs_offset;
  43. u64_le hfs_size;
  44. std::array<u8, 0x20> hfs_header_hash;
  45. std::array<u8, 0x20> initial_data_hash;
  46. u32_le secure_mode_flag;
  47. u32_le title_key_flag;
  48. u32_le key_flag;
  49. u32_le normal_area_end;
  50. GamecardInfo info;
  51. };
  52. static_assert(sizeof(GamecardHeader) == 0x200, "GamecardHeader has incorrect size.");
  53. enum class XCIPartition : u8 { Update, Normal, Secure, Logo };
  54. class XCI : public ReadOnlyVfsDirectory {
  55. public:
  56. explicit XCI(VirtualFile file);
  57. ~XCI() override;
  58. Loader::ResultStatus GetStatus() const;
  59. Loader::ResultStatus GetProgramNCAStatus() const;
  60. u8 GetFormatVersion() const;
  61. VirtualDir GetPartition(XCIPartition partition) const;
  62. std::shared_ptr<NSP> GetSecurePartitionNSP() const;
  63. VirtualDir GetSecurePartition() const;
  64. VirtualDir GetNormalPartition() const;
  65. VirtualDir GetUpdatePartition() const;
  66. VirtualDir GetLogoPartition() const;
  67. u64 GetProgramTitleID() const;
  68. bool HasProgramNCA() const;
  69. VirtualFile GetProgramNCAFile() const;
  70. const std::vector<std::shared_ptr<NCA>>& GetNCAs() const;
  71. std::shared_ptr<NCA> GetNCAByType(NCAContentType type) const;
  72. VirtualFile GetNCAFileByType(NCAContentType type) const;
  73. std::vector<VirtualFile> GetFiles() const override;
  74. std::vector<VirtualDir> GetSubdirectories() const override;
  75. std::string GetName() const override;
  76. VirtualDir GetParentDirectory() const override;
  77. private:
  78. Loader::ResultStatus AddNCAFromPartition(XCIPartition part);
  79. VirtualFile file;
  80. GamecardHeader header{};
  81. Loader::ResultStatus status;
  82. Loader::ResultStatus program_nca_status;
  83. std::vector<VirtualDir> partitions;
  84. std::shared_ptr<NSP> secure_partition;
  85. std::shared_ptr<NCA> program;
  86. std::vector<std::shared_ptr<NCA>> ncas;
  87. };
  88. } // namespace FileSys