fs.mitm: fix some filesystem issues

This commit is contained in:
Michael Scire 2019-03-26 09:05:19 -07:00
parent 106ae81614
commit ad8acaefec
8 changed files with 22 additions and 10 deletions

View file

@ -72,7 +72,7 @@ class IFile {
} }
Result Write(uint64_t offset, void *buffer, uint64_t size) { Result Write(uint64_t offset, void *buffer, uint64_t size) {
return Write(offset, buffer, size, false); return WriteImpl(offset, buffer, size, false);
} }
Result SetSize(uint64_t size) { Result SetSize(uint64_t size) {

View file

@ -18,6 +18,8 @@
#include <switch.h> #include <switch.h>
#include <stratosphere.hpp> #include <stratosphere.hpp>
#include "../utils.hpp"
#include "fs_results.hpp" #include "fs_results.hpp"
#include "fs_filesystem_types.hpp" #include "fs_filesystem_types.hpp"
#include "fs_path_utils.hpp" #include "fs_path_utils.hpp"
@ -108,7 +110,7 @@ class IFileSystem {
if (mode & ~DirectoryOpenMode_All) { if (mode & ~DirectoryOpenMode_All) {
return ResultFsInvalidArgument; return ResultFsInvalidArgument;
} }
return OpenDirectory(out_dir, path, mode); return OpenDirectoryImpl(out_dir, path, mode);
} }
Result Commit() { Result Commit() {
@ -333,10 +335,12 @@ class IFileSystemInterface : public IServiceObject {
} }
rc = this->base_fs->OpenDirectory(out_dir, path, static_cast<DirectoryOpenMode>(mode)); rc = this->base_fs->OpenDirectory(out_dir, path, static_cast<DirectoryOpenMode>(mode));
if (R_SUCCEEDED(rc)) { if (R_SUCCEEDED(rc)) {
out_intf.SetValue(std::make_shared<IDirectoryInterface>(std::move(out_dir))); out_intf.SetValue(std::make_shared<IDirectoryInterface>(std::move(out_dir)));
/* TODO: Nintendo checks allocation success here, should we?. */ /* TODO: Nintendo checks allocation success here, should we?. */
} }
return rc; return rc;
} }

View file

@ -150,13 +150,13 @@ Result FsPathUtils::IsNormalized(bool *out, const char *path) {
case PathState::WindowsDriveLetter: case PathState::WindowsDriveLetter:
return ResultFsInvalidPathFormat; return ResultFsInvalidPathFormat;
case PathState::FirstSeparator: case PathState::FirstSeparator:
case PathState::Separator:
*out = false;
break;
case PathState::Normal: case PathState::Normal:
*out = true;
break;
case PathState::CurrentDir: case PathState::CurrentDir:
case PathState::ParentDir: case PathState::ParentDir:
*out = true; case PathState::Separator:
*out = false;
break; break;
} }

View file

@ -18,6 +18,7 @@
#include <switch.h> #include <switch.h>
#include <stratosphere.hpp> #include <stratosphere.hpp>
#include "../utils.hpp"
#include "fs_subdirectory_filesystem.hpp" #include "fs_subdirectory_filesystem.hpp"
#include "fs_path_utils.hpp" #include "fs_path_utils.hpp"

View file

@ -111,7 +111,8 @@ Result FsMitmService::OpenHblWebContentFileSystem(Out<std::shared_ptr<IFileSyste
Result FsMitmService::OpenFileSystemWithPatch(Out<std::shared_ptr<IFileSystemInterface>> out_fs, u64 title_id, u32 filesystem_type) { Result FsMitmService::OpenFileSystemWithPatch(Out<std::shared_ptr<IFileSystemInterface>> out_fs, u64 title_id, u32 filesystem_type) {
FsDir d; FsDir d;
if (filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) || R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) { if (!Utils::IsWebAppletTid(this->title_id) || filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) ||
R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) {
return RESULT_FORWARD_TO_SESSION; return RESULT_FORWARD_TO_SESSION;
} }
fsDirClose(&d); fsDirClose(&d);
@ -121,7 +122,8 @@ Result FsMitmService::OpenFileSystemWithPatch(Out<std::shared_ptr<IFileSystemInt
Result FsMitmService::OpenFileSystemWithId(Out<std::shared_ptr<IFileSystemInterface>> out_fs, InPointer<char> path, u64 title_id, u32 filesystem_type) { Result FsMitmService::OpenFileSystemWithId(Out<std::shared_ptr<IFileSystemInterface>> out_fs, InPointer<char> path, u64 title_id, u32 filesystem_type) {
FsDir d; FsDir d;
if (filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) || R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) { if (!Utils::IsWebAppletTid(this->title_id) || filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) ||
R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) {
return RESULT_FORWARD_TO_SESSION; return RESULT_FORWARD_TO_SESSION;
} }
fsDirClose(&d); fsDirClose(&d);

View file

@ -80,7 +80,7 @@ class FsMitmService : public IMitmServiceObject {
DEFINE_SERVICE_DISPATCH_TABLE { DEFINE_SERVICE_DISPATCH_TABLE {
/* TODO MakeServiceCommandMeta<FspSrvCmd_OpenFileSystemDeprecated, &FsMitmService::OpenFileSystemDeprecated>(), */ /* TODO MakeServiceCommandMeta<FspSrvCmd_OpenFileSystemDeprecated, &FsMitmService::OpenFileSystemDeprecated>(), */
MakeServiceCommandMeta<FspSrvCmd_OpenFileSystemWithPatch, &FsMitmService::OpenFileSystemWithPatch, FirmwareVersion_200>(), MakeServiceCommandMeta<FspSrvCmd_OpenFileSystemWithPatch, &FsMitmService::OpenFileSystemWithPatch, FirmwareVersion_200>(),
MakeServiceCommandMeta<FspSrvCmd_OpenFileSystemDeprecated, &FsMitmService::OpenFileSystemWithId, FirmwareVersion_200>(), MakeServiceCommandMeta<FspSrvCmd_OpenFileSystemWithId, &FsMitmService::OpenFileSystemWithId, FirmwareVersion_200>(),
MakeServiceCommandMeta<FspSrvCmd_OpenBisStorage, &FsMitmService::OpenBisStorage>(), MakeServiceCommandMeta<FspSrvCmd_OpenBisStorage, &FsMitmService::OpenBisStorage>(),
MakeServiceCommandMeta<FspSrvCmd_OpenDataStorageByCurrentProcess, &FsMitmService::OpenDataStorageByCurrentProcess>(), MakeServiceCommandMeta<FspSrvCmd_OpenDataStorageByCurrentProcess, &FsMitmService::OpenDataStorageByCurrentProcess>(),
MakeServiceCommandMeta<FspSrvCmd_OpenDataStorageByDataId, &FsMitmService::OpenDataStorageByDataId>(), MakeServiceCommandMeta<FspSrvCmd_OpenDataStorageByDataId, &FsMitmService::OpenDataStorageByDataId>(),

View file

@ -383,6 +383,10 @@ bool Utils::IsHblTid(u64 tid) {
return (g_hbl_override_config.override_any_app && IsApplicationTid(tid)) || (tid == g_hbl_override_config.title_id); return (g_hbl_override_config.override_any_app && IsApplicationTid(tid)) || (tid == g_hbl_override_config.title_id);
} }
bool Utils::IsWebAppletTid(u64 tid) {
return tid == 0x010000000000100Aul || tid == 0x010000000000100Ful || tid == 0x0100000000001010ul || tid == 0x0100000000001011ul;
}
bool Utils::HasTitleFlag(u64 tid, const char *flag) { bool Utils::HasTitleFlag(u64 tid, const char *flag) {
if (IsSdInitialized()) { if (IsSdInitialized()) {
FsFile f; FsFile f;

View file

@ -65,6 +65,7 @@ class Utils {
static void InitializeThreadFunc(void *args); static void InitializeThreadFunc(void *args);
static bool IsHblTid(u64 tid); static bool IsHblTid(u64 tid);
static bool IsWebAppletTid(u64 tid);
static bool HasTitleFlag(u64 tid, const char *flag); static bool HasTitleFlag(u64 tid, const char *flag);
static bool HasHblFlag(const char *flag); static bool HasHblFlag(const char *flag);