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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user