mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2024-12-23 18:56:03 +00:00
fs.mitm: prefer official web content to hbl_html
This commit is contained in:
parent
4ccb39a228
commit
f9c9c1048e
3 changed files with 130 additions and 10 deletions
|
@ -132,6 +132,98 @@ Result fsOpenDataStorageByDataIdFwd(Service* s, FsStorageId storage_id, u64 data
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result fsOpenFileSystemWithPatchFwd(Service* s, FsFileSystem* out, u64 titleId, FsFileSystemType fsType) {
|
||||||
|
if (hosversionBefore(2, 0, 0)) {
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
|
||||||
|
}
|
||||||
|
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u32 fsType;
|
||||||
|
u64 titleId;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = serviceIpcPrepareHeader(s, &c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 7;
|
||||||
|
raw->fsType = fsType;
|
||||||
|
raw->titleId = titleId;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(s);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp;
|
||||||
|
|
||||||
|
serviceIpcParse(s, &r, sizeof(*resp));
|
||||||
|
resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
serviceCreateSubservice(&out->s, s, &r, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result fsOpenFileSystemWithIdFwd(Service* s, FsFileSystem* out, u64 titleId, FsFileSystemType fsType, const char* contentPath) {
|
||||||
|
if (hosversionBefore(2, 0, 0)) {
|
||||||
|
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
|
||||||
|
}
|
||||||
|
|
||||||
|
char sendStr[FS_MAX_PATH] = {0};
|
||||||
|
strncpy(sendStr, contentPath, sizeof(sendStr)-1);
|
||||||
|
|
||||||
|
IpcCommand c;
|
||||||
|
ipcInitialize(&c);
|
||||||
|
ipcAddSendStatic(&c, sendStr, sizeof(sendStr), 0);
|
||||||
|
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 cmd_id;
|
||||||
|
u32 fsType;
|
||||||
|
u64 titleId;
|
||||||
|
} *raw;
|
||||||
|
|
||||||
|
raw = serviceIpcPrepareHeader(s, &c, sizeof(*raw));
|
||||||
|
|
||||||
|
raw->magic = SFCI_MAGIC;
|
||||||
|
raw->cmd_id = 8;
|
||||||
|
raw->fsType = fsType;
|
||||||
|
raw->titleId = titleId;
|
||||||
|
|
||||||
|
Result rc = serviceIpcDispatch(s);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
IpcParsedCommand r;
|
||||||
|
struct {
|
||||||
|
u64 magic;
|
||||||
|
u64 result;
|
||||||
|
} *resp;
|
||||||
|
|
||||||
|
serviceIpcParse(s, &r, sizeof(*resp));
|
||||||
|
resp = r.Raw;
|
||||||
|
|
||||||
|
rc = resp->result;
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
serviceCreateSubservice(&out->s, s, &r, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
/* Missing FS File commands. */
|
/* Missing FS File commands. */
|
||||||
Result fsFileOperateRange(FsFile* f, u32 op_id, u64 off, u64 len, FsRangeInfo *out) {
|
Result fsFileOperateRange(FsFile* f, u32 op_id, u64 off, u64 len, FsRangeInfo *out) {
|
||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
|
|
|
@ -20,6 +20,8 @@ typedef struct {
|
||||||
Result fsOpenBisStorageFwd(Service* s, FsStorage* out, u32 PartitionId);
|
Result fsOpenBisStorageFwd(Service* s, FsStorage* out, u32 PartitionId);
|
||||||
Result fsOpenDataStorageByCurrentProcessFwd(Service* s, FsStorage* out);
|
Result fsOpenDataStorageByCurrentProcessFwd(Service* s, FsStorage* out);
|
||||||
Result fsOpenDataStorageByDataIdFwd(Service* s, FsStorageId storage_id, u64 data_id, FsStorage* out);
|
Result fsOpenDataStorageByDataIdFwd(Service* s, FsStorageId storage_id, u64 data_id, FsStorage* out);
|
||||||
|
Result fsOpenFileSystemWithPatchFwd(Service* s, FsFileSystem* out, u64 titleId, FsFileSystemType fsType);
|
||||||
|
Result fsOpenFileSystemWithIdFwd(Service* s, FsFileSystem* out, u64 titleId, FsFileSystemType fsType, const char* contentPath);
|
||||||
|
|
||||||
/* Missing FS File commands. */
|
/* Missing FS File commands. */
|
||||||
Result fsFileOperateRange(FsFile* f, u32 op_id, u64 off, u64 len, FsRangeInfo *out);
|
Result fsFileOperateRange(FsFile* f, u32 op_id, u64 off, u64 len, FsRangeInfo *out);
|
||||||
|
|
|
@ -110,23 +110,49 @@ 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) {
|
||||||
|
/* Check for eligibility. */
|
||||||
|
{
|
||||||
FsDir d;
|
FsDir d;
|
||||||
if (!Utils::IsWebAppletTid(this->title_id) || filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) ||
|
if (!Utils::IsWebAppletTid(this->title_id) || filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) ||
|
||||||
R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) {
|
R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) {
|
||||||
return RESULT_FORWARD_TO_SESSION;
|
return RESULT_FORWARD_TO_SESSION;
|
||||||
}
|
}
|
||||||
fsDirClose(&d);
|
fsDirClose(&d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If there's an existing filesystem, don't override. */
|
||||||
|
/* TODO: Multiplex, overriding existing content with HBL content. */
|
||||||
|
{
|
||||||
|
FsFileSystem fs;
|
||||||
|
if (R_SUCCEEDED(fsOpenFileSystemWithPatchFwd(this->forward_service.get(), &fs, title_id, static_cast<FsFileSystemType>(filesystem_type)))) {
|
||||||
|
fsFsClose(&fs);
|
||||||
|
return RESULT_FORWARD_TO_SESSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return this->OpenHblWebContentFileSystem(out_fs);
|
return this->OpenHblWebContentFileSystem(out_fs);
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
/* Check for eligibility. */
|
||||||
|
{
|
||||||
FsDir d;
|
FsDir d;
|
||||||
if (!Utils::IsWebAppletTid(this->title_id) || filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) ||
|
if (!Utils::IsWebAppletTid(this->title_id) || filesystem_type != FsFileSystemType_ContentManual || !Utils::IsHblTid(title_id) ||
|
||||||
R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) {
|
R_FAILED(Utils::OpenSdDir(AtmosphereHblWebContentDir, &d))) {
|
||||||
return RESULT_FORWARD_TO_SESSION;
|
return RESULT_FORWARD_TO_SESSION;
|
||||||
}
|
}
|
||||||
fsDirClose(&d);
|
fsDirClose(&d);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If there's an existing filesystem, don't override. */
|
||||||
|
/* TODO: Multiplex, overriding existing content with HBL content. */
|
||||||
|
{
|
||||||
|
FsFileSystem fs;
|
||||||
|
if (R_SUCCEEDED(fsOpenFileSystemWithIdFwd(this->forward_service.get(), &fs, title_id, static_cast<FsFileSystemType>(filesystem_type), path.pointer))) {
|
||||||
|
fsFsClose(&fs);
|
||||||
|
return RESULT_FORWARD_TO_SESSION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return this->OpenHblWebContentFileSystem(out_fs);
|
return this->OpenHblWebContentFileSystem(out_fs);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue