nax.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/logging/log.h"
  5. #include "core/file_sys/content_archive.h"
  6. #include "core/file_sys/romfs.h"
  7. #include "core/file_sys/xts_archive.h"
  8. #include "core/hle/kernel/process.h"
  9. #include "core/loader/nax.h"
  10. #include "core/loader/nca.h"
  11. namespace Loader {
  12. namespace {
  13. FileType IdentifyTypeImpl(const FileSys::NAX& nax) {
  14. if (nax.GetStatus() != ResultStatus::Success) {
  15. return FileType::Error;
  16. }
  17. const auto nca = nax.AsNCA();
  18. if (nca == nullptr || nca->GetStatus() != ResultStatus::Success) {
  19. return FileType::Error;
  20. }
  21. return FileType::NAX;
  22. }
  23. } // Anonymous namespace
  24. AppLoader_NAX::AppLoader_NAX(FileSys::VirtualFile file)
  25. : AppLoader(file), nax(std::make_unique<FileSys::NAX>(file)),
  26. nca_loader(std::make_unique<AppLoader_NCA>(nax->GetDecrypted())) {}
  27. AppLoader_NAX::~AppLoader_NAX() = default;
  28. FileType AppLoader_NAX::IdentifyType(const FileSys::VirtualFile& file) {
  29. const FileSys::NAX nax(file);
  30. return IdentifyTypeImpl(nax);
  31. }
  32. FileType AppLoader_NAX::GetFileType() {
  33. return IdentifyTypeImpl(*nax);
  34. }
  35. ResultStatus AppLoader_NAX::Load(Kernel::Process& process) {
  36. if (is_loaded) {
  37. return ResultStatus::ErrorAlreadyLoaded;
  38. }
  39. if (nax->GetStatus() != ResultStatus::Success)
  40. return nax->GetStatus();
  41. const auto nca = nax->AsNCA();
  42. if (nca == nullptr) {
  43. if (!Core::Crypto::KeyManager::KeyFileExists(false))
  44. return ResultStatus::ErrorMissingProductionKeyFile;
  45. return ResultStatus::ErrorNAXInconvertibleToNCA;
  46. }
  47. if (nca->GetStatus() != ResultStatus::Success)
  48. return nca->GetStatus();
  49. const auto result = nca_loader->Load(process);
  50. if (result != ResultStatus::Success)
  51. return result;
  52. is_loaded = true;
  53. return ResultStatus::Success;
  54. }
  55. ResultStatus AppLoader_NAX::ReadRomFS(FileSys::VirtualFile& dir) {
  56. return nca_loader->ReadRomFS(dir);
  57. }
  58. u64 AppLoader_NAX::ReadRomFSIVFCOffset() const {
  59. return nca_loader->ReadRomFSIVFCOffset();
  60. }
  61. ResultStatus AppLoader_NAX::ReadProgramId(u64& out_program_id) {
  62. return nca_loader->ReadProgramId(out_program_id);
  63. }
  64. } // namespace Loader