소스 검색

content_archive: Add update title detection
This is needed because the title IDs of update NCAs will not use the update title ID. The only sure way to tell is to look for a partition with BKTR crypto.

Zach Hilman 8 년 전
부모
커밋
4f18c17df7
2개의 변경된 파일11개의 추가작업 그리고 0개의 파일을 삭제
  1. 8 0
      src/core/file_sys/content_archive.cpp
  2. 3 0
      src/core/file_sys/content_archive.h

+ 8 - 0
src/core/file_sys/content_archive.cpp

@@ -258,6 +258,10 @@ NCA::NCA(VirtualFile file_) : file(std::move(file_)) {
         file->ReadBytes(sections.data(), length_sections, SECTION_HEADER_OFFSET);
     }
 
+    is_update = std::find_if(sections.begin(), sections.end(), [](const NCASectionHeader& header) {
+                    return header.raw.header.crypto_type == NCASectionCryptoType::BKTR;
+                }) != sections.end();
+
     for (std::ptrdiff_t i = 0; i < number_sections; ++i) {
         auto section = sections[i];
 
@@ -358,6 +362,10 @@ VirtualFile NCA::GetBaseFile() const {
     return file;
 }
 
+bool NCA::IsUpdate() const {
+    return is_update;
+}
+
 bool NCA::ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) {
     return false;
 }

+ 3 - 0
src/core/file_sys/content_archive.h

@@ -93,6 +93,8 @@ public:
 
     VirtualFile GetBaseFile() const;
 
+    bool IsUpdate() const;
+
 protected:
     bool ReplaceFileWithSubdirectory(VirtualFile file, VirtualDir dir) override;
 
@@ -111,6 +113,7 @@ private:
 
     NCAHeader header{};
     bool has_rights_id{};
+    bool is_update{};
 
     Loader::ResultStatus status{};