/* * Copyright (c) 2018-2019 Atmosphère-NX * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include "sm_user_service.hpp" #include "sm_registration.hpp" Result UserService::Initialize(PidDescriptor pid) { this->pid = pid.pid; this->has_initialized = true; return ResultSuccess; } Result UserService::GetService(Out out_h, SmServiceName service) { Handle session_h = 0; Result rc = ResultSmInvalidClient; #ifdef SM_ENABLE_SMHAX if (!this->has_initialized) { rc = Registration::GetServiceForPid(Registration::GetInitialProcessId(), smEncodeName(service.name), &session_h); } #endif if (this->has_initialized) { rc = Registration::GetServiceForPid(this->pid, smEncodeName(service.name), &session_h); } if (R_SUCCEEDED(rc)) { out_h.SetValue(session_h); } return rc; } Result UserService::RegisterService(Out out_h, SmServiceName service, u32 max_sessions, bool is_light) { Handle service_h = 0; Result rc = ResultSmInvalidClient; #ifdef SM_ENABLE_SMHAX if (!this->has_initialized) { rc = Registration::RegisterServiceForPid(Registration::GetInitialProcessId(), smEncodeName(service.name), max_sessions, (is_light & 1) != 0, &service_h); } #endif if (this->has_initialized) { rc = Registration::RegisterServiceForPid(this->pid, smEncodeName(service.name), max_sessions, (is_light & 1) != 0, &service_h); } if (R_SUCCEEDED(rc)) { out_h.SetValue(service_h); } return rc; } Result UserService::UnregisterService(SmServiceName service) { Result rc = ResultSmInvalidClient; #ifdef SM_ENABLE_SMHAX if (!this->has_initialized) { rc = Registration::UnregisterServiceForPid(Registration::GetInitialProcessId(), smEncodeName(service.name)); } #endif if (this->has_initialized) { rc = Registration::UnregisterServiceForPid(this->pid, smEncodeName(service.name)); } return rc; } Result UserService::AtmosphereInstallMitm(Out srv_h, Out qry_h, SmServiceName service) { Handle service_h = 0; Handle query_h = 0; Result rc = ResultSmInvalidClient; if (this->has_initialized) { rc = Registration::InstallMitmForPid(this->pid, smEncodeName(service.name), &service_h, &query_h); } if (R_SUCCEEDED(rc)) { srv_h.SetValue(service_h); qry_h.SetValue(query_h); } return rc; } Result UserService::AtmosphereUninstallMitm(SmServiceName service) { Result rc = ResultSmInvalidClient; if (this->has_initialized) { rc = Registration::UninstallMitmForPid(this->pid, smEncodeName(service.name)); } return rc; } Result UserService::AtmosphereAcknowledgeMitmSession(Out client_pid, Out fwd_h, SmServiceName service) { Result rc = ResultSmInvalidClient; Handle out_fwd_h = 0; if (this->has_initialized) { rc = Registration::AcknowledgeMitmSessionForPid(this->pid, smEncodeName(service.name), &out_fwd_h, client_pid.GetPointer()); } if (R_SUCCEEDED(rc)) { fwd_h.SetValue(out_fwd_h); } return rc; } Result UserService::AtmosphereAssociatePidTidForMitm(u64 pid, u64 tid) { Result rc = ResultSmInvalidClient; if (this->has_initialized) { if (Registration::IsInitialProcess(pid)) { rc = ResultSmNotAllowed; } else { rc = Registration::AssociatePidTidForMitm(pid, tid); } } return rc; }