From 64144ffdcad4349435d81ac0aab06241eb0339d0 Mon Sep 17 00:00:00 2001 From: emoose Date: Mon, 22 Oct 2018 17:32:03 +0100 Subject: [PATCH] Add more mount paths for the local directory This adds more mount paths for the XEX's local directory to Emulator::LaunchXexFile, so any XEXs that try to use these mountpoints can load files from the XEX directory. Mount points added: - \Device\Harddisk0\Partition0 - original mountpoint used by Xenia - \Device\Harddisk0\Partition1 - some games/apps seem to use this to refer to HDD1: - \Device\Harddisk0\Partition1\DEVKIT Used by xshell.xex, gets linked as E: (aka "development drive") Even if a DEVKIT folder exists inside the local folder, it seems we still have to add this mount point explicitly. - \Device\LauncherData Also used by xshell.xex for various UI resources The xlaunch.fdf file is normally mounted via DmMountFdfxVolume to this path (xlaunch.fdf is a FATX formatted container) By mounting this xshell can retrieve extracted resources from the local dir. - \SystemRoot Normally refers to the NAND, used by dash.xex to retrieve XZP resources when they aren't inside xam.xex. Other apps also use this to refer to other system XEXs/resources By mounting it we can just place any needed resources in the local dir. --- src/xenia/emulator.cc | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/xenia/emulator.cc b/src/xenia/emulator.cc index 55016b13e..10e437732 100644 --- a/src/xenia/emulator.cc +++ b/src/xenia/emulator.cc @@ -275,28 +275,38 @@ X_STATUS Emulator::LaunchXexFile(const std::filesystem::path& path, // and then get that symlinked to game:\, so // -> game:\foo.xex - auto mount_path = "\\Device\\Harddisk0\\Partition0"; + // Register local directory as some commonly used mount paths + std::filesystem::path mount_paths[] = { + "\\Device\\Harddisk0\\Partition0", + "\\Device\\Harddisk0\\Partition1", + "\\Device\\Harddisk0\\Partition1\\DEVKIT", + "\\Device\\LauncherData", + "\\SystemRoot", + }; + // Todo: is this even remotely correct? if (discSwap) { - mount_path = "\\Device\\LauncherData"; + mount_paths[0] = "\\Device\\LauncherData"; } // Register the local directory in the virtual filesystem. auto parent_path = path.parent_path(); - auto device = - std::make_unique(mount_path, parent_path, true); - if (!device->Initialize()) { - XELOGE("Unable to scan host path"); - return X_STATUS_NO_SUCH_FILE; - } - if (!file_system_->RegisterDevice(std::move(device))) { - XELOGE("Unable to register host path"); - return X_STATUS_NO_SUCH_FILE; + for (auto mount_path : mount_paths) { + auto device = + std::make_unique(mount_path.u8string(), parent_path, true); + if (!device->Initialize()) { + XELOGE("Unable to scan host path"); + return X_STATUS_NO_SUCH_FILE; + } + if (!file_system_->RegisterDevice(std::move(device))) { + XELOGE("Unable to register host path as {}", mount_path.u8string()); + return X_STATUS_NO_SUCH_FILE; + } } // Create symlinks to the device. - file_system_->RegisterSymbolicLink("game:", mount_path); - file_system_->RegisterSymbolicLink("d:", mount_path); + file_system_->RegisterSymbolicLink("game:", mount_paths[0].u8string()); + file_system_->RegisterSymbolicLink("d:", mount_paths[0].u8string()); // Get just the filename (foo.xex). auto file_name = path.filename();