fix host's symbolic link path to full path since kernel always use full path

This commit is contained in:
RadWolfie 2021-04-13 15:30:44 -05:00
parent 0da1273404
commit 11ac2f8058
1 changed files with 22 additions and 4 deletions

View File

@ -1231,6 +1231,18 @@ void LoadXboxKeys(std::string path)
EmuLog(LOG_LEVEL::WARNING, "Failed to load Keys.bin. Cxbx-Reloaded will be unable to read Save Data from a real Xbox");
}
//TODO: Possible move CxbxResolveHostToFullPath inline function someplace else if become useful elsewhere.
// Let filesystem library clean it up for us, including resolve host's symbolic link path.
// Since internal kernel do translate to full path than preserved host symoblic link path.
static inline void CxbxResolveHostToFullPath(std::string& file_path, std::string_view finish_error_sentence) {
std::error_code error;
std::filesystem::path sanityPath = std::filesystem::canonical(file_path, error);
if (error.value() != 0) {
CxbxKrnlCleanupEx(LOG_PREFIX_INIT, "Could not resolve to %s: %s", finish_error_sentence.data(), file_path.c_str());
}
file_path = sanityPath.string();
}
__declspec(noreturn) void CxbxKrnlInit
(
void *pTLSData,
@ -1344,16 +1356,22 @@ __declspec(noreturn) void CxbxKrnlInit
char szBuffer[sizeof(szFilePath_Xbe)];
g_EmuShared->GetStorageLocation(szBuffer);
CxbxBasePath = std::filesystem::path(std::string(szBuffer) + "\\EmuDisk\\").make_preferred().string(); // Let filesystem library clean it up for us.
CxbxBasePath = std::string(szBuffer) + "\\EmuDisk";
CxbxResolveHostToFullPath(CxbxBasePath, "Cxbx-Reloaded's EmuDisk directory");
// Since canonical always remove the extra slash, we need to manually add it back.
CxbxBasePath = std::filesystem::path(CxbxBasePath + "\\").make_preferred().string();
// Determine XBE Path
// Determine xbe path
strncpy(szBuffer, szFilePath_Xbe, sizeof(szBuffer)-1);
szBuffer[sizeof(szBuffer) - 1] = '\0'; // Safely null terminate at the end.
std::string xbePath(szBuffer);
std::replace(xbePath.begin(), xbePath.end(), ';', '/');
xbePath = std::filesystem::path(xbePath).make_preferred().string(); // Let filesystem library clean it up for us.
CxbxResolveHostToFullPath(xbePath, "xbe's file");
// Determine location for where possible auto mount D letter if ";" delimiter exist.
// Also used to store in EmuShared's title mount path permanent storage on first emulation launch.
// Unless it's launch within Cxbx-Reloaded's EmuDisk directly, then we don't store anything in title mount path storage.
std::string mount_d_dir(szBuffer);
size_t lastFind = mount_d_dir.find(';');
// First find if there is a semicolon when dashboard or title disc (such as demo disc) has it.
@ -1367,7 +1385,7 @@ __declspec(noreturn) void CxbxKrnlInit
else {
mount_d_dir = mount_d_dir.substr(0, mount_d_dir.find_last_of("\\/"));
}
mount_d_dir = std::filesystem::path(mount_d_dir).make_preferred().string(); // Let filesystem library clean it up for us.
CxbxResolveHostToFullPath(mount_d_dir, "xbe's directory");
CxbxBasePathHandle = CreateFile(CxbxBasePath.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
// Titles may assume they are running from CdRom0/Mbfs :