#include #include "pm_registration.hpp" #include "pm_shell.hpp" static bool g_has_boot_finished = false; Result ShellService::dispatch(IpcParsedCommand &r, IpcCommand &out_c, u64 cmd_id, u8 *pointer_buffer, size_t pointer_buffer_size) { Result rc = 0xF601; if (kernelAbove500()) { switch ((ShellCmd_5X)cmd_id) { case Shell_Cmd_5X_LaunchProcess: rc = WrapIpcCommandImpl<&ShellService::launch_process>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_TerminateProcessId: rc = WrapIpcCommandImpl<&ShellService::terminate_process_id>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_TerminateTitleId: rc = WrapIpcCommandImpl<&ShellService::terminate_title_id>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_GetProcessWaitEvent: rc = WrapIpcCommandImpl<&ShellService::get_process_wait_event>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_GetProcessEventType: rc = WrapIpcCommandImpl<&ShellService::get_process_event_type>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_NotifyBootFinished: rc = WrapIpcCommandImpl<&ShellService::notify_boot_finished>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_GetApplicationProcessId: rc = WrapIpcCommandImpl<&ShellService::get_application_process_id>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_5X_BoostSystemMemoryResourceLimit: rc = WrapIpcCommandImpl<&ShellService::boost_system_memory_resource_limit>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; } } else { switch ((ShellCmd)cmd_id) { case Shell_Cmd_LaunchProcess: rc = WrapIpcCommandImpl<&ShellService::launch_process>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_TerminateProcessId: rc = WrapIpcCommandImpl<&ShellService::terminate_process_id>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_TerminateTitleId: rc = WrapIpcCommandImpl<&ShellService::terminate_title_id>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_GetProcessWaitEvent: rc = WrapIpcCommandImpl<&ShellService::get_process_wait_event>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_GetProcessEventType: rc = WrapIpcCommandImpl<&ShellService::get_process_event_type>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_FinalizeDeadProcess: rc = WrapIpcCommandImpl<&ShellService::finalize_dead_process>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_ClearProcessNotificationFlag: rc = WrapIpcCommandImpl<&ShellService::clear_process_notification_flag>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_NotifyBootFinished: rc = WrapIpcCommandImpl<&ShellService::notify_boot_finished>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_GetApplicationProcessId: rc = WrapIpcCommandImpl<&ShellService::get_application_process_id>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; case Shell_Cmd_BoostSystemMemoryResourceLimit: rc = WrapIpcCommandImpl<&ShellService::boost_system_memory_resource_limit>(this, r, out_c, pointer_buffer, pointer_buffer_size); break; default: break; } } return rc; } Result ShellService::handle_deferred() { /* This service is never deferrable. */ return 0; } std::tuple launch_process(u64 launch_flags, Registration::TidSid tid_sid) { /* TODO */ return {0xF601, 0}; } std::tuple terminate_process_id(u64 pid) { /* TODO */ return {0xF601}; } std::tuple terminate_title_id(u64 tid) { /* TODO */ return {0xF601}; } std::tuple get_process_wait_event() { /* TODO */ return {0xF601, 0}; } std::tuple get_process_event_type() { /* TODO */ return {0xF601, 0, 0}; } std::tuple finalize_dead_process(u64 pid) { /* TODO */ return {0xF601}; } std::tuple clear_process_notification_flag(u64 pid) { /* TODO */ return {0xF601}; } std::tuple notify_boot_finished() { u64 boot_pid; if (!g_has_boot_finished) { Registration::LaunchProcess(BOOT2_TITLE_ID, FsStorageId_NandSystem, 0, &boot_pid); g_has_boot_finished = true; } return {0}; } std::tuple get_application_process_id() { /* TODO */ return {0xF601, 0}; } std::tuple boost_system_memory_resource_limit() { /* TODO */ return {0xF601}; }