fs.mitm: WIP LayeredFS impl (NOTE: UNUSABLE ATM)

Also greatly refactors libstratosphere, and does a lot of other things.
There is a lot of code in this one.
This commit is contained in:
Michael Scire
2018-06-14 17:50:01 -06:00
parent 82b248aeac
commit c2d9ac8f5c
56 changed files with 1615 additions and 243 deletions

View File

@@ -188,7 +188,37 @@ Result Registration::GetServiceHandle(u64 pid, u64 service, Handle *out) {
if (target_service->mitm_pid == 0 || target_service->mitm_pid == pid) {
rc = svcConnectToPort(out, target_service->port_h);
} else {
rc = svcConnectToPort(out, target_service->mitm_port_h);
IpcCommand c;
ipcInitialize(&c);
struct {
u64 magic;
u64 cmd_id;
u64 pid;
} *info = ((decltype(info))ipcPrepareHeader(&c, sizeof(*info)));
info->magic = SFCI_MAGIC;
info->cmd_id = 65000;
info->pid = pid;
rc = ipcDispatch(target_service->mitm_query_h);
if (R_SUCCEEDED(rc)) {
IpcParsedCommand r;
ipcParse(&r);
struct {
u64 magic;
u64 result;
u64 should_mitm;
} *resp = ((decltype(resp))r.Raw);
rc = resp->result;
if (R_SUCCEEDED(rc)) {
if (resp->should_mitm) {
rc = svcConnectToPort(out, target_service->mitm_port_h);
} else {
rc = svcConnectToPort(out, target_service->port_h);
}
}
}
if (R_FAILED(rc)) {
rc = svcConnectToPort(out, target_service->port_h);
}
}
if (R_FAILED(rc)) {
if ((rc & 0x3FFFFF) == 0xE01) {
@@ -343,12 +373,13 @@ Result Registration::UnregisterServiceForPid(u64 pid, u64 service) {
svcCloseHandle(target_service->port_h);
svcCloseHandle(target_service->mitm_port_h);
svcCloseHandle(target_service->mitm_query_h);
*target_service = (const Registration::Service){0};
return 0;
}
Result Registration::InstallMitmForPid(u64 pid, u64 service, Handle *out) {
Result Registration::InstallMitmForPid(u64 pid, u64 service, Handle *out, Handle *query_out) {
if (!service) {
return 0xC15;
}
@@ -387,7 +418,7 @@ Result Registration::InstallMitmForPid(u64 pid, u64 service, Handle *out) {
u64 x = 0;
Result rc = svcCreatePort(out, &target_service->mitm_port_h, target_service->max_sessions, target_service->is_light, (char *)&x);
if (R_SUCCEEDED(rc)) {
if (R_SUCCEEDED(rc) && R_SUCCEEDED((rc = svcCreateSession(query_out, &target_service->mitm_query_h, 0, 0)))) {
target_service->mitm_pid = pid;
}
@@ -416,6 +447,28 @@ Result Registration::UninstallMitmForPid(u64 pid, u64 service) {
}
svcCloseHandle(target_service->mitm_port_h);
svcCloseHandle(target_service->mitm_query_h);
target_service->mitm_pid = 0;
return 0;
}
Result Registration::AssociatePidTidForMitm(u64 pid, u64 tid) {
for (auto &service : g_service_list) {
if (service.mitm_pid) {
IpcCommand c;
ipcInitialize(&c);
struct {
u64 magic;
u64 cmd_id;
u64 pid;
u64 tid;
} *info = ((decltype(info))ipcPrepareHeader(&c, sizeof(*info)));
info->magic = SFCI_MAGIC;
info->cmd_id = 65001;
info->pid = pid;
info->tid = tid;
ipcDispatch(service.mitm_query_h);
}
}
return 0x0;
}

View File

@@ -26,6 +26,7 @@ class Registration {
/* Extension. */
u64 mitm_pid;
Handle mitm_port_h;
Handle mitm_query_h;
};
/* Utilities. */
@@ -52,6 +53,7 @@ class Registration {
static Result UnregisterServiceForPid(u64 pid, u64 service);
/* Extension. */
static Result InstallMitmForPid(u64 pid, u64 service, Handle *out);
static Result InstallMitmForPid(u64 pid, u64 service, Handle *out, Handle *query_out);
static Result UninstallMitmForPid(u64 pid, u64 service);
static Result AssociatePidTidForMitm(u64 pid, u64 tid);
};

View File

@@ -25,6 +25,9 @@ Result UserService::dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id,
case User_Cmd_AtmosphereUninstallMitm:
rc = WrapIpcCommandImpl<&UserService::uninstall_mitm>(this, r, out_c, pointer_buffer, pointer_buffer_size);
break;
case User_Cmd_AtmosphereAssociatePidTidForMitm:
rc = WrapIpcCommandImpl<&UserService::associate_pid_tid_for_mitm>(this, r, out_c, pointer_buffer, pointer_buffer_size);
break;
#endif
default:
break;
@@ -95,13 +98,26 @@ std::tuple<Result> UserService::unregister_service(u64 service) {
return {rc};
}
std::tuple<Result, MovedHandle> UserService::install_mitm(u64 service) {
std::tuple<Result, MovedHandle, MovedHandle> UserService::install_mitm(u64 service) {
Handle service_h = 0;
Handle query_h = 0;
Result rc = 0x415;
if (this->has_initialized) {
rc = Registration::InstallMitmForPid(this->pid, service, &service_h);
rc = Registration::InstallMitmForPid(this->pid, service, &service_h, &query_h);
}
return {rc, MovedHandle{service_h}};
return {rc, MovedHandle{service_h}, MovedHandle{query_h}};
}
std::tuple<Result> UserService::associate_pid_tid_for_mitm(u64 pid, u64 tid) {
Result rc = 0x415;
if (this->has_initialized) {
if (Registration::IsInitialProcess(pid)) {
rc = 0x1015;
} else {
rc = Registration::AssociatePidTidForMitm(pid, tid);
}
}
return {rc};
}
std::tuple<Result> UserService::uninstall_mitm(u64 service) {

View File

@@ -9,7 +9,8 @@ enum UserServiceCmd {
User_Cmd_UnregisterService = 3,
User_Cmd_AtmosphereInstallMitm = 65000,
User_Cmd_AtmosphereUninstallMitm = 65001
User_Cmd_AtmosphereUninstallMitm = 65001,
User_Cmd_AtmosphereAssociatePidTidForMitm = 65002
};
class UserService final : public IServiceObject {
@@ -39,6 +40,7 @@ class UserService final : public IServiceObject {
std::tuple<Result> unregister_service(u64 service);
/* Atmosphere commands. */
std::tuple<Result, MovedHandle> install_mitm(u64 service);
std::tuple<Result, MovedHandle, MovedHandle> install_mitm(u64 service);
std::tuple<Result> uninstall_mitm(u64 service);
std::tuple<Result> associate_pid_tid_for_mitm(u64 pid, u64 tid);
};