mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	patch_manager: Add usages of patches to ExeFS
This commit is contained in:
		
							parent
							
								
									8e900a301a
								
							
						
					
					
						commit
						97bf83bc56
					
				| @ -6,7 +6,10 @@ | ||||
| #include "common/assert.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| #include "core/file_sys/nca_metadata.h" | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| #include "core/file_sys/registered_cache.h" | ||||
| #include "core/file_sys/romfs_factory.h" | ||||
| #include "core/hle/service/filesystem/filesystem.h" | ||||
| @ -19,10 +22,16 @@ RomFSFactory::RomFSFactory(Loader::AppLoader& app_loader) { | ||||
|     if (app_loader.ReadRomFS(file) != Loader::ResultStatus::Success) { | ||||
|         LOG_ERROR(Service_FS, "Unable to read RomFS!"); | ||||
|     } | ||||
| 
 | ||||
|     updatable = app_loader.IsRomFSUpdatable(); | ||||
| } | ||||
| 
 | ||||
| ResultVal<VirtualFile> RomFSFactory::OpenCurrentProcess() { | ||||
|     return MakeResult<VirtualFile>(file); | ||||
|     if (!updatable) | ||||
|         return MakeResult<VirtualFile>(file); | ||||
| 
 | ||||
|     const PatchManager patch_manager(Core::CurrentProcess()->process_id); | ||||
|     return MakeResult<VirtualFile>(patch_manager.PatchRomFS(file)); | ||||
| } | ||||
| 
 | ||||
| ResultVal<VirtualFile> RomFSFactory::Open(u64 title_id, StorageId storage, ContentRecordType type) { | ||||
|  | ||||
| @ -36,6 +36,7 @@ public: | ||||
| 
 | ||||
| private: | ||||
|     VirtualFile file; | ||||
|     bool updatable; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
|  | ||||
| @ -9,6 +9,7 @@ | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/content_archive.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| #include "core/file_sys/romfs_factory.h" | ||||
| #include "core/gdbstub/gdbstub.h" | ||||
| #include "core/hle/kernel/kernel.h" | ||||
| @ -21,8 +22,9 @@ | ||||
| 
 | ||||
| namespace Loader { | ||||
| 
 | ||||
| AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile file_) | ||||
|     : AppLoader(std::move(file_)) { | ||||
| AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile file_, | ||||
|                                                                          bool override_update) | ||||
|     : AppLoader(std::move(file_)), override_update(override_update) { | ||||
|     const auto dir = file->GetContainingDirectory(); | ||||
| 
 | ||||
|     // Icon
 | ||||
| @ -66,8 +68,9 @@ AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory(FileSys | ||||
| } | ||||
| 
 | ||||
| AppLoader_DeconstructedRomDirectory::AppLoader_DeconstructedRomDirectory( | ||||
|     FileSys::VirtualDir directory) | ||||
|     : AppLoader(directory->GetFile("main")), dir(std::move(directory)) {} | ||||
|     FileSys::VirtualDir directory, bool override_update) | ||||
|     : AppLoader(directory->GetFile("main")), dir(std::move(directory)), | ||||
|       override_update(override_update) {} | ||||
| 
 | ||||
| FileType AppLoader_DeconstructedRomDirectory::IdentifyType(const FileSys::VirtualFile& file) { | ||||
|     if (FileSys::IsDirectoryExeFS(file->GetContainingDirectory())) { | ||||
| @ -89,7 +92,8 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load( | ||||
|         dir = file->GetContainingDirectory(); | ||||
|     } | ||||
| 
 | ||||
|     const FileSys::VirtualFile npdm = dir->GetFile("main.npdm"); | ||||
|     // Read meta to determine title ID
 | ||||
|     FileSys::VirtualFile npdm = dir->GetFile("main.npdm"); | ||||
|     if (npdm == nullptr) | ||||
|         return ResultStatus::ErrorMissingNPDM; | ||||
| 
 | ||||
| @ -97,6 +101,21 @@ ResultStatus AppLoader_DeconstructedRomDirectory::Load( | ||||
|     if (result != ResultStatus::Success) { | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
|     if (override_update) { | ||||
|         const FileSys::PatchManager patch_manager(metadata.GetTitleID()); | ||||
|         dir = patch_manager.PatchExeFS(dir); | ||||
|     } | ||||
| 
 | ||||
|     // Reread in case PatchExeFS affected the main.npdm
 | ||||
|     npdm = dir->GetFile("main.npdm"); | ||||
|     if (npdm == nullptr) | ||||
|         return ResultStatus::ErrorMissingNPDM; | ||||
| 
 | ||||
|     ResultStatus result2 = metadata.Load(npdm); | ||||
|     if (result2 != ResultStatus::Success) { | ||||
|         return result2; | ||||
|     } | ||||
|     metadata.Print(); | ||||
| 
 | ||||
|     const FileSys::ProgramAddressSpaceType arch_bits{metadata.GetAddressSpaceType()}; | ||||
|  | ||||
| @ -20,10 +20,12 @@ namespace Loader { | ||||
|  */ | ||||
| class AppLoader_DeconstructedRomDirectory final : public AppLoader { | ||||
| public: | ||||
|     explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile main_file); | ||||
|     explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualFile main_file, | ||||
|                                                  bool override_update = false); | ||||
| 
 | ||||
|     // Overload to accept exefs directory. Must contain 'main' and 'main.npdm'
 | ||||
|     explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualDir directory); | ||||
|     explicit AppLoader_DeconstructedRomDirectory(FileSys::VirtualDir directory, | ||||
|                                                  bool override_update = false); | ||||
| 
 | ||||
|     /**
 | ||||
|      * Returns the type of the file | ||||
| @ -51,6 +53,7 @@ private: | ||||
|     std::vector<u8> icon_data; | ||||
|     std::string name; | ||||
|     u64 title_id{}; | ||||
|     bool override_update; | ||||
| }; | ||||
| 
 | ||||
| } // namespace Loader
 | ||||
|  | ||||
| @ -48,7 +48,7 @@ ResultStatus AppLoader_NCA::Load(Kernel::SharedPtr<Kernel::Process>& process) { | ||||
|     if (exefs == nullptr) | ||||
|         return ResultStatus::ErrorNoExeFS; | ||||
| 
 | ||||
|     directory_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(exefs); | ||||
|     directory_loader = std::make_unique<AppLoader_DeconstructedRomDirectory>(exefs, true); | ||||
| 
 | ||||
|     const auto load_result = directory_loader->Load(process); | ||||
|     if (load_result != ResultStatus::Success) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Zach Hilman
						Zach Hilman