mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-08-07 08:38:45 +00:00
sf: convert ro/sm to new format
This commit is contained in:
parent
b661571fc3
commit
dec1f7fba2
23 changed files with 382 additions and 296 deletions
|
@ -16,4 +16,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ro/ro_types.hpp"
|
#include <stratosphere/ro/ro_types.hpp>
|
||||||
|
#include <stratosphere/ro/impl/ro_ro_interface.hpp>
|
||||||
|
#include <stratosphere/ro/impl/ro_debug_monitor_interface.hpp>
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/ro/ro_types.hpp>
|
||||||
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
|
namespace ams::ro::impl {
|
||||||
|
|
||||||
|
#define AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, GetProcessModuleInfo, (sf::Out<u32> out_count, const sf::OutArray<LoaderModuleInfo> &out_infos, os::ProcessId process_id))
|
||||||
|
|
||||||
|
AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_RO_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/ro/ro_types.hpp>
|
||||||
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
|
namespace ams::ro::impl {
|
||||||
|
|
||||||
|
#define AMS_RO_I_RO_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, MapManualLoadModuleMemory, (sf::Out<u64> out_load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, UnmapManualLoadModuleMemory, (const sf::ClientProcessId &client_pid, u64 nro_address)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, RegisterModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, UnregisterModuleInfo, (const sf::ClientProcessId &client_pid, u64 nrr_address)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 4, Result, RegisterProcessHandle, (const sf::ClientProcessId &client_pid, sf::CopyHandle process_h)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 10, Result, RegisterModuleInfoEx, (const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h), hos::Version_7_0_0)
|
||||||
|
|
||||||
|
AMS_SF_DEFINE_INTERFACE(IRoInterface, AMS_RO_I_RO_INTERFACE_INTERFACE_INFO)
|
||||||
|
|
||||||
|
}
|
|
@ -16,9 +16,13 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "sm/sm_types.hpp"
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
#include "sm/sm_api.hpp"
|
#include <stratosphere/sm/sm_api.hpp>
|
||||||
#include "sm/sm_mitm_api.hpp"
|
#include <stratosphere/sm/sm_mitm_api.hpp>
|
||||||
#include "sm/sm_scoped_holder.hpp"
|
#include <stratosphere/sm/sm_scoped_holder.hpp>
|
||||||
|
|
||||||
#include "sm/sm_manager_api.hpp"
|
#include <stratosphere/sm/sm_manager_api.hpp>
|
||||||
|
|
||||||
|
#include <stratosphere/sm/impl/sm_user_interface.hpp>
|
||||||
|
#include <stratosphere/sm/impl/sm_manager_interface.hpp>
|
||||||
|
#include <stratosphere/sm/impl/sm_debug_monitor_interface.hpp>
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
|
namespace ams::sm::impl {
|
||||||
|
|
||||||
|
#define AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereGetRecord, (sf::Out<ServiceRecord> record, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereListRecords, (const sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count, u64 offset)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65002, void, AtmosphereGetRecordSize, (sf::Out<u64> record_size))
|
||||||
|
|
||||||
|
AMS_SF_DEFINE_INTERFACE(IDebugMonitorInterface, AMS_SM_I_DEBUG_MONITOR_INTERFACE_INTERFACE_INFO)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
|
namespace ams::sm::impl {
|
||||||
|
|
||||||
|
#define AMS_SM_I_MANAGER_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, RegisterProcess, (os::ProcessId process_id, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, UnregisterProcess, (os::ProcessId process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, void, AtmosphereEndInitDefers, ()) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, void, AtmosphereHasMitm, (sf::Out<bool> out, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65002, Result, AtmosphereRegisterProcess, (os::ProcessId process_id, ncm::ProgramId program_id, cfg::OverrideStatus override_status, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac))
|
||||||
|
|
||||||
|
AMS_SF_DEFINE_INTERFACE(IManagerInterface, AMS_SM_I_MANAGER_INTERFACE_INTERFACE_INFO)
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <vapours.hpp>
|
||||||
|
#include <stratosphere/sm/sm_types.hpp>
|
||||||
|
#include <stratosphere/sf.hpp>
|
||||||
|
|
||||||
|
namespace ams::sm::impl {
|
||||||
|
|
||||||
|
#define AMS_SM_I_USER_INTERFACE_INTERFACE_INFO(C, H) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 0, Result, RegisterClient, (const sf::ClientProcessId &client_process_id)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 1, Result, GetServiceHandle, (sf::OutMoveHandle out_h, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 2, Result, RegisterService, (sf::OutMoveHandle out_h, ServiceName service, u32 max_sessions, bool is_light)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 3, Result, UnregisterService, (ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65000, Result, AtmosphereInstallMitm, (sf::OutMoveHandle srv_h, sf::OutMoveHandle qry_h, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65001, Result, AtmosphereUninstallMitm, (ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65003, Result, AtmosphereAcknowledgeMitmSession, (sf::Out<MitmProcessInfo> client_info, sf::OutMoveHandle fwd_h, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65004, Result, AtmosphereHasMitm, (sf::Out<bool> out, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65005, Result, AtmosphereWaitMitm, (ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65006, Result, AtmosphereDeclareFutureMitm, (ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65100, Result, AtmosphereHasService, (sf::Out<bool> out, ServiceName service)) \
|
||||||
|
AMS_SF_METHOD_INFO(C, H, 65101, Result, AtmosphereWaitService, (ServiceName service))
|
||||||
|
|
||||||
|
AMS_SF_DEFINE_INTERFACE(IUserInterface, AMS_SM_I_USER_INTERFACE_INTERFACE_INFO)
|
||||||
|
|
||||||
|
}
|
|
@ -413,7 +413,7 @@ namespace ams::ro::impl {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Service implementations. */
|
/* Service implementations. */
|
||||||
Result LoadNrr(size_t context_id, Handle process_h, u64 nrr_address, u64 nrr_size, ModuleType expected_type, bool enforce_type) {
|
Result RegisterModuleInfo(size_t context_id, Handle process_h, u64 nrr_address, u64 nrr_size, ModuleType expected_type, bool enforce_type) {
|
||||||
/* Get context. */
|
/* Get context. */
|
||||||
ProcessContext *context = GetContextById(context_id);
|
ProcessContext *context = GetContextById(context_id);
|
||||||
AMS_ABORT_UNLESS(context != nullptr);
|
AMS_ABORT_UNLESS(context != nullptr);
|
||||||
|
@ -454,7 +454,7 @@ namespace ams::ro::impl {
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result UnloadNrr(size_t context_id, u64 nrr_address) {
|
Result UnregisterModuleInfo(size_t context_id, u64 nrr_address) {
|
||||||
/* Get context. */
|
/* Get context. */
|
||||||
ProcessContext *context = GetContextById(context_id);
|
ProcessContext *context = GetContextById(context_id);
|
||||||
AMS_ABORT_UNLESS(context != nullptr);
|
AMS_ABORT_UNLESS(context != nullptr);
|
||||||
|
@ -476,7 +476,7 @@ namespace ams::ro::impl {
|
||||||
return UnmapNrr(context->process_handle, nrr_backup.mapped_header, nrr_backup.nrr_heap_address, nrr_backup.nrr_heap_size, nrr_backup.mapped_code_address);
|
return UnmapNrr(context->process_handle, nrr_backup.mapped_header, nrr_backup.nrr_heap_address, nrr_backup.nrr_heap_size, nrr_backup.mapped_code_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result LoadNro(u64 *out_address, size_t context_id, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
Result MapManualLoadModuleMemory(u64 *out_address, size_t context_id, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
||||||
/* Get context. */
|
/* Get context. */
|
||||||
ProcessContext *context = GetContextById(context_id);
|
ProcessContext *context = GetContextById(context_id);
|
||||||
AMS_ABORT_UNLESS(context != nullptr);
|
AMS_ABORT_UNLESS(context != nullptr);
|
||||||
|
@ -522,7 +522,7 @@ namespace ams::ro::impl {
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result UnloadNro(size_t context_id, u64 nro_address) {
|
Result UnmapManualLoadModuleMemory(size_t context_id, u64 nro_address) {
|
||||||
/* Get context. */
|
/* Get context. */
|
||||||
ProcessContext *context = GetContextById(context_id);
|
ProcessContext *context = GetContextById(context_id);
|
||||||
AMS_ABORT_UNLESS(context != nullptr);
|
AMS_ABORT_UNLESS(context != nullptr);
|
||||||
|
|
|
@ -35,10 +35,10 @@ namespace ams::ro::impl {
|
||||||
void UnregisterProcess(size_t context_id);
|
void UnregisterProcess(size_t context_id);
|
||||||
|
|
||||||
/* Service implementations. */
|
/* Service implementations. */
|
||||||
Result LoadNrr(size_t context_id, Handle process_h, u64 nrr_address, u64 nrr_size, ModuleType expected_type, bool enforce_type);
|
Result RegisterModuleInfo(size_t context_id, Handle process_h, u64 nrr_address, u64 nrr_size, ModuleType expected_type, bool enforce_type);
|
||||||
Result UnloadNrr(size_t context_id, u64 nrr_address);
|
Result UnregisterModuleInfo(size_t context_id, u64 nrr_address);
|
||||||
Result LoadNro(u64 *out_address, size_t context_id, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size);
|
Result MapManualLoadModuleMemory(u64 *out_address, size_t context_id, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size);
|
||||||
Result UnloadNro(size_t context_id, u64 nro_address);
|
Result UnmapManualLoadModuleMemory(size_t context_id, u64 nro_address);
|
||||||
|
|
||||||
/* Debug service implementations. */
|
/* Debug service implementations. */
|
||||||
Result GetProcessModuleInfo(u32 *out_count, LoaderModuleInfo *out_infos, size_t max_out_count, os::ProcessId process_id);
|
Result GetProcessModuleInfo(u32 *out_count, LoaderModuleInfo *out_infos, size_t max_out_count, os::ProcessId process_id);
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
#include "ro_debug_monitor.hpp"
|
#include "ro_debug_monitor_service.hpp"
|
||||||
#include "impl/ro_service_impl.hpp"
|
#include "impl/ro_service_impl.hpp"
|
||||||
|
|
||||||
namespace ams::ro {
|
namespace ams::ro {
|
|
@ -18,18 +18,10 @@
|
||||||
|
|
||||||
namespace ams::ro {
|
namespace ams::ro {
|
||||||
|
|
||||||
class DebugMonitorService final : public sf::IServiceObject {
|
class DebugMonitorService final {
|
||||||
protected:
|
|
||||||
enum class CommandId {
|
|
||||||
GetProcessModuleInfo = 0,
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
/* Actual commands. */
|
|
||||||
Result GetProcessModuleInfo(sf::Out<u32> out_count, const sf::OutArray<LoaderModuleInfo> &out_infos, os::ProcessId process_id);
|
|
||||||
public:
|
public:
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
Result GetProcessModuleInfo(sf::Out<u32> out_count, const sf::OutArray<LoaderModuleInfo> &out_infos, os::ProcessId process_id);
|
||||||
MAKE_SERVICE_COMMAND_META(GetProcessModuleInfo),
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
static_assert(ro::impl::IsIDebugMonitorInterface<DebugMonitorService>);
|
||||||
|
|
||||||
}
|
}
|
|
@ -14,8 +14,8 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
#include "ro_debug_monitor.hpp"
|
#include "ro_debug_monitor_service.hpp"
|
||||||
#include "ro_service.hpp"
|
#include "ro_ro_service.hpp"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
extern u32 __start__;
|
extern u32 __start__;
|
||||||
|
@ -84,10 +84,6 @@ void __appExit(void) {
|
||||||
setsysExit();
|
setsysExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Helpers to create RO objects. */
|
|
||||||
static constexpr auto MakeRoServiceForSelf = []() { return std::make_shared<ro::Service>(ro::ModuleType::ForSelf); };
|
|
||||||
static constexpr auto MakeRoServiceForOthers = []() { return std::make_shared<ro::Service>(ro::ModuleType::ForOthers); };
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
/* ldr:ro, ro:dmnt, ro:1. */
|
/* ldr:ro, ro:dmnt, ro:1. */
|
||||||
|
@ -122,11 +118,11 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create services. */
|
/* Create services. */
|
||||||
R_ABORT_UNLESS((g_server_manager.RegisterServer<ro::DebugMonitorService>(DebugMonitorServiceName, DebugMonitorMaxSessions)));
|
R_ABORT_UNLESS((g_server_manager.RegisterServer<ro::impl::IDebugMonitorInterface, ro::DebugMonitorService>(DebugMonitorServiceName, DebugMonitorMaxSessions)));
|
||||||
|
|
||||||
R_ABORT_UNLESS((g_server_manager.RegisterServer<ro::Service, +MakeRoServiceForSelf>(ForSelfServiceName, ForSelfMaxSessions)));
|
R_ABORT_UNLESS((g_server_manager.RegisterServer<ro::impl::IRoInterface, ro::RoServiceForSelf>(ForSelfServiceName, ForSelfMaxSessions)));
|
||||||
if (hos::GetVersion() >= hos::Version_7_0_0) {
|
if (hos::GetVersion() >= hos::Version_7_0_0) {
|
||||||
R_ABORT_UNLESS((g_server_manager.RegisterServer<ro::Service, +MakeRoServiceForOthers>(ForOthersServiceName, ForOthersMaxSessions)));
|
R_ABORT_UNLESS((g_server_manager.RegisterServer<ro::impl::IRoInterface, ro::RoServiceForOthers>(ForOthersServiceName, ForOthersMaxSessions)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loop forever, servicing our services. */
|
/* Loop forever, servicing our services. */
|
||||||
|
|
67
stratosphere/ro/source/ro_ro_service.cpp
Normal file
67
stratosphere/ro/source/ro_ro_service.cpp
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
#include "ro_ro_service.hpp"
|
||||||
|
#include "impl/ro_service_impl.hpp"
|
||||||
|
|
||||||
|
namespace ams::ro {
|
||||||
|
|
||||||
|
void SetDevelopmentHardware(bool is_development_hardware) {
|
||||||
|
impl::SetDevelopmentHardware(is_development_hardware);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetDevelopmentFunctionEnabled(bool is_development_function_enabled) {
|
||||||
|
impl::SetDevelopmentFunctionEnabled(is_development_function_enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
RoService::RoService(ModuleType t) : context_id(impl::InvalidContextId), type(t) {
|
||||||
|
/* ... */
|
||||||
|
}
|
||||||
|
|
||||||
|
RoService::~RoService() {
|
||||||
|
impl::UnregisterProcess(this->context_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RoService::MapManualLoadModuleMemory(sf::Out<u64> load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
||||||
|
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
||||||
|
return impl::MapManualLoadModuleMemory(load_address.GetPointer(), this->context_id, nro_address, nro_size, bss_address, bss_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RoService::UnmapManualLoadModuleMemory(const sf::ClientProcessId &client_pid, u64 nro_address) {
|
||||||
|
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
||||||
|
return impl::UnmapManualLoadModuleMemory(this->context_id, nro_address);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RoService::RegisterModuleInfo(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size) {
|
||||||
|
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
||||||
|
return impl::RegisterModuleInfo(this->context_id, svc::InvalidHandle, nrr_address, nrr_size, ModuleType::ForSelf, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RoService::UnregisterModuleInfo(const sf::ClientProcessId &client_pid, u64 nrr_address) {
|
||||||
|
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
||||||
|
return impl::UnregisterModuleInfo(this->context_id, nrr_address);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RoService::RegisterProcessHandle(const sf::ClientProcessId &client_pid, sf::CopyHandle process_h) {
|
||||||
|
return impl::RegisterProcess(std::addressof(this->context_id), process_h.GetValue(), client_pid.GetValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
Result RoService::RegisterModuleInfoEx(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h) {
|
||||||
|
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
||||||
|
return impl::RegisterModuleInfo(this->context_id, process_h.GetValue(), nrr_address, nrr_size, this->type, this->type == ModuleType::ForOthers);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
56
stratosphere/ro/source/ro_ro_service.hpp
Normal file
56
stratosphere/ro/source/ro_ro_service.hpp
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::ro {
|
||||||
|
|
||||||
|
/* Access utilities. */
|
||||||
|
void SetDevelopmentHardware(bool is_development_hardware);
|
||||||
|
void SetDevelopmentFunctionEnabled(bool is_development_function_enabled);
|
||||||
|
|
||||||
|
class RoService {
|
||||||
|
private:
|
||||||
|
size_t context_id;
|
||||||
|
ModuleType type;
|
||||||
|
protected:
|
||||||
|
explicit RoService(ModuleType t);
|
||||||
|
public:
|
||||||
|
virtual ~RoService();
|
||||||
|
public:
|
||||||
|
/* Actual commands. */
|
||||||
|
Result MapManualLoadModuleMemory(sf::Out<u64> out_load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size);
|
||||||
|
Result UnmapManualLoadModuleMemory(const sf::ClientProcessId &client_pid, u64 nro_address);
|
||||||
|
Result RegisterModuleInfo(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size);
|
||||||
|
Result UnregisterModuleInfo(const sf::ClientProcessId &client_pid, u64 nrr_address);
|
||||||
|
Result RegisterProcessHandle(const sf::ClientProcessId &client_pid, sf::CopyHandle process_h);
|
||||||
|
Result RegisterModuleInfoEx(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h);
|
||||||
|
};
|
||||||
|
static_assert(ro::impl::IsIRoInterface<RoService>);
|
||||||
|
|
||||||
|
class RoServiceForSelf final : public RoService {
|
||||||
|
public:
|
||||||
|
RoServiceForSelf() : RoService(ro::ModuleType::ForSelf) { /* ... */ }
|
||||||
|
};
|
||||||
|
|
||||||
|
/* TODO: This is really JitPlugin... */
|
||||||
|
class RoServiceForOthers final : public RoService {
|
||||||
|
public:
|
||||||
|
RoServiceForOthers() : RoService(ro::ModuleType::ForOthers) { /* ... */ }
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
|
@ -1,67 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#include <stratosphere.hpp>
|
|
||||||
#include "ro_service.hpp"
|
|
||||||
#include "impl/ro_service_impl.hpp"
|
|
||||||
|
|
||||||
namespace ams::ro {
|
|
||||||
|
|
||||||
void SetDevelopmentHardware(bool is_development_hardware) {
|
|
||||||
impl::SetDevelopmentHardware(is_development_hardware);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetDevelopmentFunctionEnabled(bool is_development_function_enabled) {
|
|
||||||
impl::SetDevelopmentFunctionEnabled(is_development_function_enabled);
|
|
||||||
}
|
|
||||||
|
|
||||||
Service::Service(ModuleType t) : context_id(impl::InvalidContextId), type(t) {
|
|
||||||
/* ... */
|
|
||||||
}
|
|
||||||
|
|
||||||
Service::~Service() {
|
|
||||||
impl::UnregisterProcess(this->context_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result Service::LoadNro(sf::Out<u64> load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
|
||||||
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
|
||||||
return impl::LoadNro(load_address.GetPointer(), this->context_id, nro_address, nro_size, bss_address, bss_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result Service::UnloadNro(const sf::ClientProcessId &client_pid, u64 nro_address) {
|
|
||||||
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
|
||||||
return impl::UnloadNro(this->context_id, nro_address);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result Service::LoadNrr(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size) {
|
|
||||||
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
|
||||||
return impl::LoadNrr(this->context_id, INVALID_HANDLE, nrr_address, nrr_size, ModuleType::ForSelf, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result Service::UnloadNrr(const sf::ClientProcessId &client_pid, u64 nrr_address) {
|
|
||||||
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
|
||||||
return impl::UnloadNrr(this->context_id, nrr_address);
|
|
||||||
}
|
|
||||||
|
|
||||||
Result Service::Initialize(const sf::ClientProcessId &client_pid, sf::CopyHandle process_h) {
|
|
||||||
return impl::RegisterProcess(&this->context_id, process_h.GetValue(), client_pid.GetValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
Result Service::LoadNrrEx(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h) {
|
|
||||||
R_TRY(impl::ValidateProcess(this->context_id, client_pid.GetValue()));
|
|
||||||
return impl::LoadNrr(this->context_id, process_h.GetValue(), nrr_address, nrr_size, this->type, this->type == ModuleType::ForOthers);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,62 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#include <stratosphere.hpp>
|
|
||||||
|
|
||||||
namespace ams::ro {
|
|
||||||
|
|
||||||
/* Access utilities. */
|
|
||||||
void SetDevelopmentHardware(bool is_development_hardware);
|
|
||||||
void SetDevelopmentFunctionEnabled(bool is_development_function_enabled);
|
|
||||||
|
|
||||||
class Service final : public sf::IServiceObject {
|
|
||||||
protected:
|
|
||||||
enum class CommandId {
|
|
||||||
LoadNro = 0,
|
|
||||||
UnloadNro = 1,
|
|
||||||
LoadNrr = 2,
|
|
||||||
UnloadNrr = 3,
|
|
||||||
Initialize = 4,
|
|
||||||
LoadNrrEx = 10,
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
size_t context_id;
|
|
||||||
ModuleType type;
|
|
||||||
public:
|
|
||||||
explicit Service(ModuleType t);
|
|
||||||
virtual ~Service();
|
|
||||||
private:
|
|
||||||
/* Actual commands. */
|
|
||||||
Result LoadNro(sf::Out<u64> out_load_address, const sf::ClientProcessId &client_pid, u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size);
|
|
||||||
Result UnloadNro(const sf::ClientProcessId &client_pid, u64 nro_address);
|
|
||||||
Result LoadNrr(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size);
|
|
||||||
Result UnloadNrr(const sf::ClientProcessId &client_pid, u64 nrr_address);
|
|
||||||
Result Initialize(const sf::ClientProcessId &client_pid, sf::CopyHandle process_h);
|
|
||||||
Result LoadNrrEx(const sf::ClientProcessId &client_pid, u64 nrr_address, u64 nrr_size, sf::CopyHandle process_h);
|
|
||||||
public:
|
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
|
||||||
MAKE_SERVICE_COMMAND_META(LoadNro),
|
|
||||||
MAKE_SERVICE_COMMAND_META(UnloadNro),
|
|
||||||
MAKE_SERVICE_COMMAND_META(LoadNrr),
|
|
||||||
MAKE_SERVICE_COMMAND_META(UnloadNrr),
|
|
||||||
MAKE_SERVICE_COMMAND_META(Initialize),
|
|
||||||
MAKE_SERVICE_COMMAND_META(LoadNrrEx, hos::Version_7_0_0),
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -14,20 +14,20 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
#include "sm_dmnt_service.hpp"
|
#include "sm_debug_monitor_service.hpp"
|
||||||
#include "impl/sm_service_manager.hpp"
|
#include "impl/sm_service_manager.hpp"
|
||||||
|
|
||||||
namespace ams::sm {
|
namespace ams::sm {
|
||||||
|
|
||||||
Result DmntService::AtmosphereGetRecord(sf::Out<ServiceRecord> record, ServiceName service) {
|
Result DebugMonitorService::AtmosphereGetRecord(sf::Out<ServiceRecord> record, ServiceName service) {
|
||||||
return impl::GetServiceRecord(record.GetPointer(), service);
|
return impl::GetServiceRecord(record.GetPointer(), service);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DmntService::AtmosphereListRecords(const sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count, u64 offset) {
|
void DebugMonitorService::AtmosphereListRecords(const sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count, u64 offset) {
|
||||||
R_ABORT_UNLESS(impl::ListServiceRecords(records.GetPointer(), out_count.GetPointer(), offset, records.GetSize()));
|
R_ABORT_UNLESS(impl::ListServiceRecords(records.GetPointer(), out_count.GetPointer(), offset, records.GetSize()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void DmntService::AtmosphereGetRecordSize(sf::Out<u64> record_size) {
|
void DebugMonitorService::AtmosphereGetRecordSize(sf::Out<u64> record_size) {
|
||||||
record_size.SetValue(sizeof(ServiceRecord));
|
record_size.SetValue(sizeof(ServiceRecord));
|
||||||
}
|
}
|
||||||
|
|
31
stratosphere/sm/source/sm_debug_monitor_service.hpp
Normal file
31
stratosphere/sm/source/sm_debug_monitor_service.hpp
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <stratosphere.hpp>
|
||||||
|
|
||||||
|
namespace ams::sm {
|
||||||
|
|
||||||
|
/* Service definition. */
|
||||||
|
class DebugMonitorService final {
|
||||||
|
public:
|
||||||
|
Result AtmosphereGetRecord(sf::Out<ServiceRecord> record, ServiceName service);
|
||||||
|
void AtmosphereListRecords(const sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count, u64 offset);
|
||||||
|
void AtmosphereGetRecordSize(sf::Out<u64> record_size);
|
||||||
|
};
|
||||||
|
static_assert(sm::impl::IsIDebugMonitorInterface<DebugMonitorService>);
|
||||||
|
|
||||||
|
}
|
|
@ -1,44 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2018-2020 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 <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#include <stratosphere.hpp>
|
|
||||||
|
|
||||||
namespace ams::sm {
|
|
||||||
|
|
||||||
/* Service definition. */
|
|
||||||
class DmntService final : public sf::IServiceObject {
|
|
||||||
protected:
|
|
||||||
/* Command IDs. */
|
|
||||||
enum class CommandId {
|
|
||||||
AtmosphereGetRecord = 65000,
|
|
||||||
AtmosphereListRecords = 65001,
|
|
||||||
AtmosphereGetRecordSize = 65002,
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
/* Actual commands. */
|
|
||||||
virtual Result AtmosphereGetRecord(sf::Out<ServiceRecord> record, ServiceName service);
|
|
||||||
virtual void AtmosphereListRecords(const sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count, u64 offset);
|
|
||||||
virtual void AtmosphereGetRecordSize(sf::Out<u64> record_size);
|
|
||||||
public:
|
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereGetRecord),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereListRecords),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereGetRecordSize),
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
|
@ -16,7 +16,7 @@
|
||||||
#include <stratosphere.hpp>
|
#include <stratosphere.hpp>
|
||||||
#include "sm_user_service.hpp"
|
#include "sm_user_service.hpp"
|
||||||
#include "sm_manager_service.hpp"
|
#include "sm_manager_service.hpp"
|
||||||
#include "sm_dmnt_service.hpp"
|
#include "sm_debug_monitor_service.hpp"
|
||||||
#include "impl/sm_service_manager.hpp"
|
#include "impl/sm_service_manager.hpp"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -101,14 +101,14 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
Handle sm_h;
|
Handle sm_h;
|
||||||
R_ABORT_UNLESS(svcManageNamedPort(&sm_h, "sm:", 0x40));
|
R_ABORT_UNLESS(svcManageNamedPort(&sm_h, "sm:", 0x40));
|
||||||
g_server_manager.RegisterServer<sm::UserService>(sm_h);
|
g_server_manager.RegisterServer<sm::impl::IUserInterface, sm::UserService>(sm_h);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create sm:m manually. */
|
/* Create sm:m manually. */
|
||||||
{
|
{
|
||||||
Handle smm_h;
|
Handle smm_h;
|
||||||
R_ABORT_UNLESS(sm::impl::RegisterServiceForSelf(&smm_h, sm::ServiceName::Encode("sm:m"), 1));
|
R_ABORT_UNLESS(sm::impl::RegisterServiceForSelf(&smm_h, sm::ServiceName::Encode("sm:m"), 1));
|
||||||
g_server_manager.RegisterServer<sm::ManagerService>(smm_h);
|
g_server_manager.RegisterServer<sm::impl::IManagerInterface, sm::ManagerService>(smm_h);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*===== ATMOSPHERE EXTENSION =====*/
|
/*===== ATMOSPHERE EXTENSION =====*/
|
||||||
|
@ -116,7 +116,7 @@ int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
Handle smdmnt_h;
|
Handle smdmnt_h;
|
||||||
R_ABORT_UNLESS(sm::impl::RegisterServiceForSelf(&smdmnt_h, sm::ServiceName::Encode("sm:dmnt"), 1));
|
R_ABORT_UNLESS(sm::impl::RegisterServiceForSelf(&smdmnt_h, sm::ServiceName::Encode("sm:dmnt"), 1));
|
||||||
g_server_manager.RegisterServer<sm::DmntService>(smdmnt_h);
|
g_server_manager.RegisterServer<sm::impl::IDebugMonitorInterface, sm::DebugMonitorService>(smdmnt_h);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*================================*/
|
/*================================*/
|
||||||
|
|
|
@ -19,33 +19,14 @@
|
||||||
namespace ams::sm {
|
namespace ams::sm {
|
||||||
|
|
||||||
/* Service definition. */
|
/* Service definition. */
|
||||||
class ManagerService final : public sf::IServiceObject {
|
class ManagerService final {
|
||||||
protected:
|
|
||||||
/* Command IDs. */
|
|
||||||
enum class CommandId {
|
|
||||||
RegisterProcess = 0,
|
|
||||||
UnregisterProcess = 1,
|
|
||||||
|
|
||||||
AtmosphereEndInitDefers = 65000,
|
|
||||||
AtmosphereHasMitm = 65001,
|
|
||||||
AtmosphereRegisterProcess = 65002,
|
|
||||||
};
|
|
||||||
private:
|
|
||||||
/* Actual commands. */
|
|
||||||
virtual Result RegisterProcess(os::ProcessId process_id, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac);
|
|
||||||
virtual Result UnregisterProcess(os::ProcessId process_id);
|
|
||||||
virtual void AtmosphereEndInitDefers();
|
|
||||||
virtual void AtmosphereHasMitm(sf::Out<bool> out, ServiceName service);
|
|
||||||
virtual Result AtmosphereRegisterProcess(os::ProcessId process_id, ncm::ProgramId program_id, cfg::OverrideStatus override_status, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac);
|
|
||||||
public:
|
public:
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
Result RegisterProcess(os::ProcessId process_id, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac);
|
||||||
MAKE_SERVICE_COMMAND_META(RegisterProcess),
|
Result UnregisterProcess(os::ProcessId process_id);
|
||||||
MAKE_SERVICE_COMMAND_META(UnregisterProcess),
|
void AtmosphereEndInitDefers();
|
||||||
|
void AtmosphereHasMitm(sf::Out<bool> out, ServiceName service);
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereEndInitDefers),
|
Result AtmosphereRegisterProcess(os::ProcessId process_id, ncm::ProgramId program_id, cfg::OverrideStatus override_status, const sf::InBuffer &acid_sac, const sf::InBuffer &aci_sac);
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereHasMitm),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereRegisterProcess),
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
static_assert(sm::impl::IsIManagerInterface<ManagerService>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,20 +19,18 @@
|
||||||
|
|
||||||
namespace ams::sm {
|
namespace ams::sm {
|
||||||
|
|
||||||
Result UserService::Initialize(const sf::ClientProcessId &client_process_id) {
|
Result UserService::RegisterClient(const sf::ClientProcessId &client_process_id) {
|
||||||
this->process_id = client_process_id.GetValue();
|
this->process_id = client_process_id.GetValue();
|
||||||
this->has_initialized = true;
|
this->has_initialized = true;
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result UserService::EnsureInitialized() {
|
Result UserService::EnsureInitialized() {
|
||||||
if (!this->has_initialized) {
|
R_UNLESS(this->has_initialized, sm::ResultInvalidClient());
|
||||||
return sm::ResultInvalidClient();
|
|
||||||
}
|
|
||||||
return ResultSuccess();
|
return ResultSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result UserService::GetService(sf::OutMoveHandle out_h, ServiceName service) {
|
Result UserService::GetServiceHandle(sf::OutMoveHandle out_h, ServiceName service) {
|
||||||
R_TRY(this->EnsureInitialized());
|
R_TRY(this->EnsureInitialized());
|
||||||
return impl::GetServiceHandle(out_h.GetHandlePointer(), this->process_id, service);
|
return impl::GetServiceHandle(out_h.GetHandlePointer(), this->process_id, service);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,26 +20,7 @@
|
||||||
namespace ams::sm {
|
namespace ams::sm {
|
||||||
|
|
||||||
/* Service definition. */
|
/* Service definition. */
|
||||||
class UserService final : public sf::IServiceObject {
|
class UserService final {
|
||||||
protected:
|
|
||||||
/* Command IDs. */
|
|
||||||
enum class CommandId {
|
|
||||||
Initialize = 0,
|
|
||||||
GetService = 1,
|
|
||||||
RegisterService = 2,
|
|
||||||
UnregisterService = 3,
|
|
||||||
|
|
||||||
AtmosphereInstallMitm = 65000,
|
|
||||||
AtmosphereUninstallMitm = 65001,
|
|
||||||
/* Deprecated: AtmosphereAssociatePidTidForMitm = 65002 */
|
|
||||||
AtmosphereAcknowledgeMitmSession = 65003,
|
|
||||||
AtmosphereHasMitm = 65004,
|
|
||||||
AtmosphereWaitMitm = 65005,
|
|
||||||
AtmosphereDeclareFutureMitm = 65006,
|
|
||||||
|
|
||||||
AtmosphereHasService = 65100,
|
|
||||||
AtmosphereWaitService = 65101,
|
|
||||||
};
|
|
||||||
private:
|
private:
|
||||||
os::ProcessId process_id = os::InvalidProcessId;
|
os::ProcessId process_id = os::InvalidProcessId;
|
||||||
bool has_initialized = false;
|
bool has_initialized = false;
|
||||||
|
@ -47,38 +28,22 @@ namespace ams::sm {
|
||||||
Result EnsureInitialized();
|
Result EnsureInitialized();
|
||||||
public:
|
public:
|
||||||
/* Official commands. */
|
/* Official commands. */
|
||||||
virtual Result Initialize(const sf::ClientProcessId &client_process_id);
|
Result RegisterClient(const sf::ClientProcessId &client_process_id);
|
||||||
virtual Result GetService(sf::OutMoveHandle out_h, ServiceName service);
|
Result GetServiceHandle(sf::OutMoveHandle out_h, ServiceName service);
|
||||||
virtual Result RegisterService(sf::OutMoveHandle out_h, ServiceName service, u32 max_sessions, bool is_light);
|
Result RegisterService(sf::OutMoveHandle out_h, ServiceName service, u32 max_sessions, bool is_light);
|
||||||
virtual Result UnregisterService(ServiceName service);
|
Result UnregisterService(ServiceName service);
|
||||||
|
|
||||||
/* Atmosphere commands. */
|
/* Atmosphere commands. */
|
||||||
virtual Result AtmosphereInstallMitm(sf::OutMoveHandle srv_h, sf::OutMoveHandle qry_h, ServiceName service);
|
Result AtmosphereInstallMitm(sf::OutMoveHandle srv_h, sf::OutMoveHandle qry_h, ServiceName service);
|
||||||
virtual Result AtmosphereUninstallMitm(ServiceName service);
|
Result AtmosphereUninstallMitm(ServiceName service);
|
||||||
virtual Result AtmosphereAcknowledgeMitmSession(sf::Out<MitmProcessInfo> client_info, sf::OutMoveHandle fwd_h, ServiceName service);
|
Result AtmosphereAcknowledgeMitmSession(sf::Out<MitmProcessInfo> client_info, sf::OutMoveHandle fwd_h, ServiceName service);
|
||||||
virtual Result AtmosphereHasMitm(sf::Out<bool> out, ServiceName service);
|
Result AtmosphereHasMitm(sf::Out<bool> out, ServiceName service);
|
||||||
virtual Result AtmosphereWaitMitm(ServiceName service);
|
Result AtmosphereWaitMitm(ServiceName service);
|
||||||
virtual Result AtmosphereDeclareFutureMitm(ServiceName service);
|
Result AtmosphereDeclareFutureMitm(ServiceName service);
|
||||||
|
|
||||||
virtual Result AtmosphereHasService(sf::Out<bool> out, ServiceName service);
|
Result AtmosphereHasService(sf::Out<bool> out, ServiceName service);
|
||||||
virtual Result AtmosphereWaitService(ServiceName service);
|
Result AtmosphereWaitService(ServiceName service);
|
||||||
public:
|
|
||||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
|
||||||
MAKE_SERVICE_COMMAND_META(Initialize),
|
|
||||||
MAKE_SERVICE_COMMAND_META(GetService),
|
|
||||||
MAKE_SERVICE_COMMAND_META(RegisterService),
|
|
||||||
MAKE_SERVICE_COMMAND_META(UnregisterService),
|
|
||||||
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereInstallMitm),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereUninstallMitm),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereAcknowledgeMitmSession),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereHasMitm),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereWaitMitm),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereDeclareFutureMitm),
|
|
||||||
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereHasService),
|
|
||||||
MAKE_SERVICE_COMMAND_META(AtmosphereWaitService),
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
static_assert(sm::impl::IsIUserInterface<UserService>);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue