mirror of
https://github.com/Atmosphere-NX/Atmosphere.git
synced 2025-05-27 21:24:11 -04:00
strat: TitleId -> ProgramId, titles->contents
This commit is contained in:
parent
1636668762
commit
ea3ebbaa7d
86 changed files with 1138 additions and 1140 deletions
|
@ -17,7 +17,7 @@
|
|||
|
||||
namespace ams::pm::impl {
|
||||
|
||||
ProcessInfo::ProcessInfo(Handle h, os::ProcessId pid, ldr::PinId pin, const ncm::TitleLocation &l) : process_id(pid), pin_id(pin), loc(l), handle(h), state(ProcessState_Created), flags(0), waitable_holder(h) {
|
||||
ProcessInfo::ProcessInfo(Handle h, os::ProcessId pid, ldr::PinId pin, const ncm::ProgramLocation &l) : process_id(pid), pin_id(pin), loc(l), handle(h), state(ProcessState_Created), flags(0), waitable_holder(h) {
|
||||
this->waitable_holder.SetUserData(reinterpret_cast<uintptr_t>(this));
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ namespace ams::pm::impl {
|
|||
/* Unregister the process. */
|
||||
fsprUnregisterProgram(static_cast<u64>(this->process_id));
|
||||
sm::manager::UnregisterProcess(this->process_id);
|
||||
ldr::pm::UnpinTitle(this->pin_id);
|
||||
ldr::pm::UnpinProgram(this->pin_id);
|
||||
|
||||
/* Close the process's handle. */
|
||||
svcCloseHandle(this->handle);
|
||||
|
|
|
@ -40,7 +40,7 @@ namespace ams::pm::impl {
|
|||
util::IntrusiveListNode list_node;
|
||||
const os::ProcessId process_id;
|
||||
const ldr::PinId pin_id;
|
||||
const ncm::TitleLocation loc;
|
||||
const ncm::ProgramLocation loc;
|
||||
Handle handle;
|
||||
ProcessState state;
|
||||
u32 flags;
|
||||
|
@ -58,7 +58,7 @@ namespace ams::pm::impl {
|
|||
return (this->flags & flag);
|
||||
}
|
||||
public:
|
||||
ProcessInfo(Handle h, os::ProcessId pid, ldr::PinId pin, const ncm::TitleLocation &l);
|
||||
ProcessInfo(Handle h, os::ProcessId pid, ldr::PinId pin, const ncm::ProgramLocation &l);
|
||||
~ProcessInfo();
|
||||
void Cleanup();
|
||||
|
||||
|
@ -78,7 +78,7 @@ namespace ams::pm::impl {
|
|||
return this->pin_id;
|
||||
}
|
||||
|
||||
const ncm::TitleLocation &GetTitleLocation() {
|
||||
const ncm::ProgramLocation &GetProgramLocation() {
|
||||
return this->loc;
|
||||
}
|
||||
|
||||
|
@ -179,9 +179,9 @@ namespace ams::pm::impl {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
ProcessInfo *Find(ncm::TitleId title_id) {
|
||||
ProcessInfo *Find(ncm::ProgramId program_id) {
|
||||
for (auto it = this->begin(); it != this->end(); it++) {
|
||||
if ((*it).GetTitleLocation().title_id == title_id) {
|
||||
if ((*it).GetProgramLocation().program_id == program_id) {
|
||||
return &*it;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,13 +24,13 @@ namespace ams::pm::impl {
|
|||
|
||||
/* Types. */
|
||||
enum HookType {
|
||||
HookType_TitleId = (1 << 0),
|
||||
HookType_ProgramId = (1 << 0),
|
||||
HookType_Application = (1 << 1),
|
||||
};
|
||||
|
||||
struct LaunchProcessArgs {
|
||||
os::ProcessId *out_process_id;
|
||||
ncm::TitleLocation location;
|
||||
ncm::ProgramLocation location;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
|
@ -202,7 +202,7 @@ namespace ams::pm::impl {
|
|||
LaunchProcessArgs g_process_launch_args = {};
|
||||
|
||||
/* Hook globals. */
|
||||
std::atomic<ncm::TitleId> g_title_id_hook;
|
||||
std::atomic<ncm::ProgramId> g_program_id_hook;
|
||||
std::atomic<bool> g_application_hook;
|
||||
|
||||
/* Forward declarations. */
|
||||
|
@ -284,12 +284,12 @@ namespace ams::pm::impl {
|
|||
/* Ensure we only try to run one application. */
|
||||
R_UNLESS(!is_application || !HasApplicationProcess(), pm::ResultApplicationRunning());
|
||||
|
||||
/* Fix the title location to use the right title id. */
|
||||
const ncm::TitleLocation location = ncm::TitleLocation::Make(program_info.title_id, static_cast<ncm::StorageId>(args.location.storage_id));
|
||||
/* Fix the program location to use the right program id. */
|
||||
const ncm::ProgramLocation location = ncm::ProgramLocation::Make(program_info.program_id, static_cast<ncm::StorageId>(args.location.storage_id));
|
||||
|
||||
/* Pin the program with loader. */
|
||||
ldr::PinId pin_id;
|
||||
R_TRY(ldr::pm::PinTitle(&pin_id, location));
|
||||
R_TRY(ldr::pm::PinProgram(&pin_id, location));
|
||||
|
||||
|
||||
/* Ensure resources are available. */
|
||||
|
@ -298,7 +298,7 @@ namespace ams::pm::impl {
|
|||
/* Actually create the process. */
|
||||
Handle process_handle;
|
||||
{
|
||||
auto pin_guard = SCOPE_GUARD { ldr::pm::UnpinTitle(pin_id); };
|
||||
auto pin_guard = SCOPE_GUARD { ldr::pm::UnpinProgram(pin_id); };
|
||||
R_TRY(ldr::pm::CreateProcess(&process_handle, pin_id, GetLoaderCreateProcessFlags(args.flags), resource::GetResourceLimitHandle(&program_info)));
|
||||
pin_guard.Cancel();
|
||||
}
|
||||
|
@ -331,8 +331,8 @@ namespace ams::pm::impl {
|
|||
const u8 *aci_fah = acid_fac + program_info.acid_fac_size;
|
||||
|
||||
/* Register with FS and SM. */
|
||||
R_TRY(fsprRegisterProgram(static_cast<u64>(process_id), static_cast<u64>(location.title_id), static_cast<FsStorageId>(location.storage_id), aci_fah, program_info.aci_fah_size, acid_fac, program_info.acid_fac_size));
|
||||
R_TRY(sm::manager::RegisterProcess(process_id, location.title_id, acid_sac, program_info.acid_sac_size, aci_sac, program_info.aci_sac_size));
|
||||
R_TRY(fsprRegisterProgram(static_cast<u64>(process_id), static_cast<u64>(location.program_id), static_cast<FsStorageId>(location.storage_id), aci_fah, program_info.aci_fah_size, acid_fac, program_info.acid_fac_size));
|
||||
R_TRY(sm::manager::RegisterProcess(process_id, location.program_id, acid_sac, program_info.acid_sac_size, aci_sac, program_info.aci_sac_size));
|
||||
|
||||
/* Set flags. */
|
||||
if (is_application) {
|
||||
|
@ -349,9 +349,9 @@ namespace ams::pm::impl {
|
|||
}
|
||||
|
||||
/* Process hooks/signaling. */
|
||||
if (location.title_id == g_title_id_hook) {
|
||||
if (location.program_id == g_program_id_hook) {
|
||||
g_hook_to_create_process_event.Signal();
|
||||
g_title_id_hook = ncm::TitleId::Invalid;
|
||||
g_program_id_hook = ncm::ProgramId::Invalid;
|
||||
} else if (is_application && g_application_hook) {
|
||||
g_hook_to_create_application_process_event.Signal();
|
||||
g_application_hook = false;
|
||||
|
@ -466,8 +466,8 @@ namespace ams::pm::impl {
|
|||
}
|
||||
|
||||
/* Process Management. */
|
||||
Result LaunchTitle(os::ProcessId *out_process_id, const ncm::TitleLocation &loc, u32 flags) {
|
||||
/* Ensure we only try to launch one title at a time. */
|
||||
Result LaunchProgram(os::ProcessId *out_process_id, const ncm::ProgramLocation &loc, u32 flags) {
|
||||
/* Ensure we only try to launch one program at a time. */
|
||||
static os::Mutex s_lock;
|
||||
std::scoped_lock lk(s_lock);
|
||||
|
||||
|
@ -491,7 +491,7 @@ namespace ams::pm::impl {
|
|||
R_UNLESS(!process_info->HasStarted(), pm::ResultAlreadyStarted());
|
||||
|
||||
ldr::ProgramInfo program_info;
|
||||
R_TRY(ldr::pm::GetProgramInfo(&program_info, process_info->GetTitleLocation()));
|
||||
R_TRY(ldr::pm::GetProgramInfo(&program_info, process_info->GetProgramLocation()));
|
||||
return StartProcess(process_info, &program_info);
|
||||
}
|
||||
|
||||
|
@ -504,10 +504,10 @@ namespace ams::pm::impl {
|
|||
return svcTerminateProcess(process_info->GetHandle());
|
||||
}
|
||||
|
||||
Result TerminateTitle(ncm::TitleId title_id) {
|
||||
Result TerminateProgram(ncm::ProgramId program_id) {
|
||||
ProcessListAccessor list(g_process_list);
|
||||
|
||||
auto process_info = list->Find(title_id);
|
||||
auto process_info = list->Find(program_id);
|
||||
R_UNLESS(process_info != nullptr, pm::ResultProcessNotFound());
|
||||
|
||||
return svcTerminateProcess(process_info->GetHandle());
|
||||
|
@ -615,23 +615,23 @@ namespace ams::pm::impl {
|
|||
return ResultSuccess();
|
||||
}
|
||||
|
||||
Result GetProcessId(os::ProcessId *out, ncm::TitleId title_id) {
|
||||
Result GetProcessId(os::ProcessId *out, ncm::ProgramId program_id) {
|
||||
ProcessListAccessor list(g_process_list);
|
||||
|
||||
auto process_info = list->Find(title_id);
|
||||
auto process_info = list->Find(program_id);
|
||||
R_UNLESS(process_info != nullptr, pm::ResultProcessNotFound());
|
||||
|
||||
*out = process_info->GetProcessId();
|
||||
return ResultSuccess();
|
||||
}
|
||||
|
||||
Result GetTitleId(ncm::TitleId *out, os::ProcessId process_id) {
|
||||
Result GetProgramId(ncm::ProgramId *out, os::ProcessId process_id) {
|
||||
ProcessListAccessor list(g_process_list);
|
||||
|
||||
auto process_info = list->Find(process_id);
|
||||
R_UNLESS(process_info != nullptr, pm::ResultProcessNotFound());
|
||||
|
||||
*out = process_info->GetTitleLocation().title_id;
|
||||
*out = process_info->GetProgramLocation().program_id;
|
||||
return ResultSuccess();
|
||||
}
|
||||
|
||||
|
@ -648,24 +648,24 @@ namespace ams::pm::impl {
|
|||
return pm::ResultProcessNotFound();
|
||||
}
|
||||
|
||||
Result AtmosphereGetProcessInfo(Handle *out_process_handle, ncm::TitleLocation *out_loc, os::ProcessId process_id) {
|
||||
Result AtmosphereGetProcessInfo(Handle *out_process_handle, ncm::ProgramLocation *out_loc, os::ProcessId process_id) {
|
||||
ProcessListAccessor list(g_process_list);
|
||||
|
||||
auto process_info = list->Find(process_id);
|
||||
R_UNLESS(process_info != nullptr, pm::ResultProcessNotFound());
|
||||
|
||||
*out_process_handle = process_info->GetHandle();
|
||||
*out_loc = process_info->GetTitleLocation();
|
||||
*out_loc = process_info->GetProgramLocation();
|
||||
return ResultSuccess();
|
||||
}
|
||||
|
||||
/* Hook API. */
|
||||
Result HookToCreateProcess(Handle *out_hook, ncm::TitleId title_id) {
|
||||
Result HookToCreateProcess(Handle *out_hook, ncm::ProgramId program_id) {
|
||||
*out_hook = INVALID_HANDLE;
|
||||
|
||||
{
|
||||
ncm::TitleId old_value = ncm::TitleId::Invalid;
|
||||
R_UNLESS(g_title_id_hook.compare_exchange_strong(old_value, title_id), pm::ResultDebugHookInUse());
|
||||
ncm::ProgramId old_value = ncm::ProgramId::Invalid;
|
||||
R_UNLESS(g_program_id_hook.compare_exchange_strong(old_value, program_id), pm::ResultDebugHookInUse());
|
||||
}
|
||||
|
||||
*out_hook = g_hook_to_create_process_event.GetReadableHandle();
|
||||
|
@ -685,8 +685,8 @@ namespace ams::pm::impl {
|
|||
}
|
||||
|
||||
Result ClearHook(u32 which) {
|
||||
if (which & HookType_TitleId) {
|
||||
g_title_id_hook = ncm::TitleId::Invalid;
|
||||
if (which & HookType_ProgramId) {
|
||||
g_program_id_hook = ncm::ProgramId::Invalid;
|
||||
}
|
||||
if (which & HookType_Application) {
|
||||
g_application_hook = false;
|
||||
|
|
|
@ -22,10 +22,10 @@ namespace ams::pm::impl {
|
|||
Result InitializeProcessManager();
|
||||
|
||||
/* Process Management. */
|
||||
Result LaunchTitle(os::ProcessId *out_process_id, const ncm::TitleLocation &loc, u32 flags);
|
||||
Result LaunchProgram(os::ProcessId *out_process_id, const ncm::ProgramLocation &loc, u32 flags);
|
||||
Result StartProcess(os::ProcessId process_id);
|
||||
Result TerminateProcess(os::ProcessId process_id);
|
||||
Result TerminateTitle(ncm::TitleId title_id);
|
||||
Result TerminateProgram(ncm::ProgramId program_id);
|
||||
Result GetProcessEventHandle(Handle *out);
|
||||
Result GetProcessEventInfo(ProcessEventInfo *out);
|
||||
Result CleanupProcess(os::ProcessId process_id);
|
||||
|
@ -34,13 +34,13 @@ namespace ams::pm::impl {
|
|||
/* Information Getters. */
|
||||
Result GetModuleIdList(u32 *out_count, u8 *out_buf, size_t max_out_count, u64 unused);
|
||||
Result GetExceptionProcessIdList(u32 *out_count, os::ProcessId *out_process_ids, size_t max_out_count);
|
||||
Result GetProcessId(os::ProcessId *out, ncm::TitleId title_id);
|
||||
Result GetTitleId(ncm::TitleId *out, os::ProcessId process_id);
|
||||
Result GetProcessId(os::ProcessId *out, ncm::ProgramId program_id);
|
||||
Result GetProgramId(ncm::ProgramId *out, os::ProcessId process_id);
|
||||
Result GetApplicationProcessId(os::ProcessId *out_process_id);
|
||||
Result AtmosphereGetProcessInfo(Handle *out_process_handle, ncm::TitleLocation *out_loc, os::ProcessId process_id);
|
||||
Result AtmosphereGetProcessInfo(Handle *out_process_handle, ncm::ProgramLocation *out_loc, os::ProcessId process_id);
|
||||
|
||||
/* Hook API. */
|
||||
Result HookToCreateProcess(Handle *out_hook, ncm::TitleId title_id);
|
||||
Result HookToCreateProcess(Handle *out_hook, ncm::ProgramId program_id);
|
||||
Result HookToCreateApplicationProcess(Handle *out_hook);
|
||||
Result ClearHook(u32 which);
|
||||
|
||||
|
|
|
@ -33,12 +33,12 @@ namespace ams::pm::dmnt {
|
|||
return impl::StartProcess(process_id);
|
||||
}
|
||||
|
||||
Result DebugMonitorServiceBase::GetProcessId(sf::Out<os::ProcessId> out, ncm::TitleId title_id) {
|
||||
return impl::GetProcessId(out.GetPointer(), title_id);
|
||||
Result DebugMonitorServiceBase::GetProcessId(sf::Out<os::ProcessId> out, ncm::ProgramId program_id) {
|
||||
return impl::GetProcessId(out.GetPointer(), program_id);
|
||||
}
|
||||
|
||||
Result DebugMonitorServiceBase::HookToCreateProcess(sf::OutCopyHandle out_hook, ncm::TitleId title_id) {
|
||||
return impl::HookToCreateProcess(out_hook.GetHandlePointer(), title_id);
|
||||
Result DebugMonitorServiceBase::HookToCreateProcess(sf::OutCopyHandle out_hook, ncm::ProgramId program_id) {
|
||||
return impl::HookToCreateProcess(out_hook.GetHandlePointer(), program_id);
|
||||
}
|
||||
|
||||
Result DebugMonitorServiceBase::GetApplicationProcessId(sf::Out<os::ProcessId> out) {
|
||||
|
@ -54,7 +54,7 @@ namespace ams::pm::dmnt {
|
|||
}
|
||||
|
||||
/* Atmosphere extension commands. */
|
||||
Result DebugMonitorServiceBase::AtmosphereGetProcessInfo(sf::OutCopyHandle out_process_handle, sf::Out<ncm::TitleLocation> out_loc, os::ProcessId process_id) {
|
||||
Result DebugMonitorServiceBase::AtmosphereGetProcessInfo(sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, os::ProcessId process_id) {
|
||||
return impl::AtmosphereGetProcessInfo(out_process_handle.GetHandlePointer(), out_loc.GetPointer(), process_id);
|
||||
}
|
||||
|
||||
|
|
|
@ -24,14 +24,14 @@ namespace ams::pm::dmnt {
|
|||
virtual Result GetModuleIdList(sf::Out<u32> out_count, const sf::OutBuffer &out_buf, u64 unused);
|
||||
virtual Result GetExceptionProcessIdList(sf::Out<u32> out_count, const sf::OutArray<os::ProcessId> &out_process_ids);
|
||||
virtual Result StartProcess(os::ProcessId process_id);
|
||||
virtual Result GetProcessId(sf::Out<os::ProcessId> out, ncm::TitleId title_id);
|
||||
virtual Result HookToCreateProcess(sf::OutCopyHandle out_hook, ncm::TitleId title_id);
|
||||
virtual Result GetProcessId(sf::Out<os::ProcessId> out, ncm::ProgramId program_id);
|
||||
virtual Result HookToCreateProcess(sf::OutCopyHandle out_hook, ncm::ProgramId program_id);
|
||||
virtual Result GetApplicationProcessId(sf::Out<os::ProcessId> out);
|
||||
virtual Result HookToCreateApplicationProcess(sf::OutCopyHandle out_hook);
|
||||
virtual Result ClearHook(u32 which);
|
||||
|
||||
/* Atmosphere extension commands. */
|
||||
virtual Result AtmosphereGetProcessInfo(sf::OutCopyHandle out_process_handle, sf::Out<ncm::TitleLocation> out_loc, os::ProcessId process_id);
|
||||
virtual Result AtmosphereGetProcessInfo(sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, os::ProcessId process_id);
|
||||
virtual Result AtmosphereGetCurrentLimitInfo(sf::Out<u64> out_cur_val, sf::Out<u64> out_lim_val, u32 group, u32 resource);
|
||||
};
|
||||
|
||||
|
|
|
@ -19,22 +19,22 @@
|
|||
namespace ams::pm::info {
|
||||
|
||||
/* Overrides for libstratosphere pm::info commands. */
|
||||
Result HasLaunchedTitle(bool *out, ncm::TitleId title_id) {
|
||||
return ldr::pm::HasLaunchedTitle(out, title_id);
|
||||
Result HasLaunchedProgram(bool *out, ncm::ProgramId program_id) {
|
||||
return ldr::pm::HasLaunchedProgram(out, program_id);
|
||||
}
|
||||
|
||||
/* Actual command implementations. */
|
||||
Result InformationService::GetTitleId(sf::Out<ncm::TitleId> out, os::ProcessId process_id) {
|
||||
return impl::GetTitleId(out.GetPointer(), process_id);
|
||||
Result InformationService::GetProgramId(sf::Out<ncm::ProgramId> out, os::ProcessId process_id) {
|
||||
return impl::GetProgramId(out.GetPointer(), process_id);
|
||||
}
|
||||
|
||||
/* Atmosphere extension commands. */
|
||||
Result InformationService::AtmosphereGetProcessId(sf::Out<os::ProcessId> out, ncm::TitleId title_id) {
|
||||
return impl::GetProcessId(out.GetPointer(), title_id);
|
||||
Result InformationService::AtmosphereGetProcessId(sf::Out<os::ProcessId> out, ncm::ProgramId program_id) {
|
||||
return impl::GetProcessId(out.GetPointer(), program_id);
|
||||
}
|
||||
|
||||
Result InformationService::AtmosphereHasLaunchedTitle(sf::Out<bool> out, ncm::TitleId title_id) {
|
||||
return pm::info::HasLaunchedTitle(out.GetPointer(), title_id);
|
||||
Result InformationService::AtmosphereHasLaunchedProgram(sf::Out<bool> out, ncm::ProgramId program_id) {
|
||||
return pm::info::HasLaunchedProgram(out.GetPointer(), program_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,24 +21,24 @@ namespace ams::pm::info {
|
|||
class InformationService final : public sf::IServiceObject {
|
||||
private:
|
||||
enum class CommandId {
|
||||
GetTitleId = 0,
|
||||
GetProgramId = 0,
|
||||
|
||||
AtmosphereGetProcessId = 65000,
|
||||
AtmosphereHasLaunchedTitle = 65001,
|
||||
AtmosphereHasLaunchedProgram = 65001,
|
||||
};
|
||||
private:
|
||||
/* Actual command implementations. */
|
||||
Result GetTitleId(sf::Out<ncm::TitleId> out, os::ProcessId process_id);
|
||||
Result GetProgramId(sf::Out<ncm::ProgramId> out, os::ProcessId process_id);
|
||||
|
||||
/* Atmosphere extension commands. */
|
||||
Result AtmosphereGetProcessId(sf::Out<os::ProcessId> out, ncm::TitleId title_id);
|
||||
Result AtmosphereHasLaunchedTitle(sf::Out<bool> out, ncm::TitleId title_id);
|
||||
Result AtmosphereGetProcessId(sf::Out<os::ProcessId> out, ncm::ProgramId program_id);
|
||||
Result AtmosphereHasLaunchedProgram(sf::Out<bool> out, ncm::ProgramId program_id);
|
||||
public:
|
||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||
MAKE_SERVICE_COMMAND_META(GetTitleId),
|
||||
MAKE_SERVICE_COMMAND_META(GetProgramId),
|
||||
|
||||
MAKE_SERVICE_COMMAND_META(AtmosphereGetProcessId),
|
||||
MAKE_SERVICE_COMMAND_META(AtmosphereHasLaunchedTitle),
|
||||
MAKE_SERVICE_COMMAND_META(AtmosphereHasLaunchedProgram),
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ extern "C" {
|
|||
|
||||
namespace ams {
|
||||
|
||||
ncm::TitleId CurrentTitleId = ncm::TitleId::Pm;
|
||||
ncm::ProgramId CurrentProgramId = ncm::ProgramId::Pm;
|
||||
|
||||
namespace result {
|
||||
|
||||
|
@ -76,13 +76,13 @@ namespace {
|
|||
constexpr u8 PrivilegedServiceAccessControl[] = {0x80, '*', 0x00, '*'};
|
||||
constexpr size_t ProcessCountMax = 0x40;
|
||||
|
||||
/* This uses debugging SVCs to retrieve a process's title id. */
|
||||
ncm::TitleId GetProcessTitleId(os::ProcessId process_id) {
|
||||
/* Check if we should return our title id. */
|
||||
/* This uses debugging SVCs to retrieve a process's program id. */
|
||||
ncm::ProgramId GetProcessProgramId(os::ProcessId process_id) {
|
||||
/* Check if we should return our program id. */
|
||||
/* Doing this here works around a bug fixed in 6.0.0. */
|
||||
/* Not doing so will cause svcDebugActiveProcess to deadlock on lower firmwares if called for it's own process. */
|
||||
if (process_id == os::GetCurrentProcessId()) {
|
||||
return ams::CurrentTitleId;
|
||||
return ams::CurrentProgramId;
|
||||
}
|
||||
|
||||
/* Get a debug handle. */
|
||||
|
@ -94,19 +94,19 @@ namespace {
|
|||
while (true) {
|
||||
R_ASSERT(svcGetDebugEvent(reinterpret_cast<u8 *>(&d), debug_handle.Get()));
|
||||
if (d.type == svc::DebugEventType::AttachProcess) {
|
||||
return ncm::TitleId{d.info.attach_process.title_id};
|
||||
return ncm::ProgramId{d.info.attach_process.program_id};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* This works around a bug fixed by FS in 4.0.0. */
|
||||
/* Not doing so will cause KIPs with higher process IDs than 7 to be unable to use filesystem services. */
|
||||
/* It also registers privileged processes with SM, so that their title IDs can be known. */
|
||||
/* It also registers privileged processes with SM, so that their program ids can be known. */
|
||||
void RegisterPrivilegedProcess(os::ProcessId process_id) {
|
||||
fsprUnregisterProgram(static_cast<u64>(process_id));
|
||||
fsprRegisterProgram(static_cast<u64>(process_id), static_cast<u64>(process_id), FsStorageId_NandSystem, PrivilegedFileAccessHeader, sizeof(PrivilegedFileAccessHeader), PrivilegedFileAccessControl, sizeof(PrivilegedFileAccessControl));
|
||||
sm::manager::UnregisterProcess(process_id);
|
||||
sm::manager::RegisterProcess(process_id, GetProcessTitleId(process_id), PrivilegedServiceAccessControl, sizeof(PrivilegedServiceAccessControl), PrivilegedServiceAccessControl, sizeof(PrivilegedServiceAccessControl));
|
||||
sm::manager::RegisterProcess(process_id, GetProcessProgramId(process_id), PrivilegedServiceAccessControl, sizeof(PrivilegedServiceAccessControl), PrivilegedServiceAccessControl, sizeof(PrivilegedServiceAccessControl));
|
||||
}
|
||||
|
||||
void RegisterPrivilegedProcesses() {
|
||||
|
|
|
@ -19,21 +19,21 @@
|
|||
namespace ams::pm::shell {
|
||||
|
||||
/* Overrides for libstratosphere pm::shell commands. */
|
||||
Result LaunchTitle(os::ProcessId *out_process_id, const ncm::TitleLocation &loc, u32 launch_flags) {
|
||||
return impl::LaunchTitle(out_process_id, loc, launch_flags);
|
||||
Result LaunchProgram(os::ProcessId *out_process_id, const ncm::ProgramLocation &loc, u32 launch_flags) {
|
||||
return impl::LaunchProgram(out_process_id, loc, launch_flags);
|
||||
}
|
||||
|
||||
/* Service command implementations. */
|
||||
Result ShellServiceBase::LaunchTitle(sf::Out<os::ProcessId> out_process_id, const ncm::TitleLocation &loc, u32 flags) {
|
||||
return pm::shell::LaunchTitle(out_process_id.GetPointer(), loc, flags);
|
||||
Result ShellServiceBase::LaunchProgram(sf::Out<os::ProcessId> out_process_id, const ncm::ProgramLocation &loc, u32 flags) {
|
||||
return pm::shell::LaunchProgram(out_process_id.GetPointer(), loc, flags);
|
||||
}
|
||||
|
||||
Result ShellServiceBase::TerminateProcess(os::ProcessId process_id) {
|
||||
return impl::TerminateProcess(process_id);
|
||||
}
|
||||
|
||||
Result ShellServiceBase::TerminateTitle(ncm::TitleId title_id) {
|
||||
return impl::TerminateTitle(title_id);
|
||||
Result ShellServiceBase::TerminateProgram(ncm::ProgramId program_id) {
|
||||
return impl::TerminateProgram(program_id);
|
||||
}
|
||||
|
||||
void ShellServiceBase::GetProcessEventHandle(sf::OutCopyHandle out) {
|
||||
|
|
|
@ -21,9 +21,9 @@ namespace ams::pm::shell {
|
|||
class ShellServiceBase : public sf::IServiceObject {
|
||||
protected:
|
||||
/* Actual command implementations. */
|
||||
virtual Result LaunchTitle(sf::Out<os::ProcessId> out_process_id, const ncm::TitleLocation &loc, u32 flags);
|
||||
virtual Result LaunchProgram(sf::Out<os::ProcessId> out_process_id, const ncm::ProgramLocation &loc, u32 flags);
|
||||
virtual Result TerminateProcess(os::ProcessId process_id);
|
||||
virtual Result TerminateTitle(ncm::TitleId title_id);
|
||||
virtual Result TerminateProgram(ncm::ProgramId program_id);
|
||||
virtual void GetProcessEventHandle(sf::OutCopyHandle out);
|
||||
virtual void GetProcessEventInfo(sf::Out<ProcessEventInfo> out);
|
||||
virtual Result CleanupProcess(os::ProcessId process_id);
|
||||
|
@ -39,9 +39,9 @@ namespace ams::pm::shell {
|
|||
class ShellService final : public ShellServiceBase {
|
||||
private:
|
||||
enum class CommandId {
|
||||
LaunchTitle = 0,
|
||||
LaunchProgram = 0,
|
||||
TerminateProcess = 1,
|
||||
TerminateTitle = 2,
|
||||
TerminateProgram = 2,
|
||||
GetProcessEventHandle = 3,
|
||||
GetProcessEventInfo = 4,
|
||||
NotifyBootFinished = 5,
|
||||
|
@ -53,9 +53,9 @@ namespace ams::pm::shell {
|
|||
public:
|
||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||
/* 5.0.0-* */
|
||||
MAKE_SERVICE_COMMAND_META(LaunchTitle),
|
||||
MAKE_SERVICE_COMMAND_META(LaunchProgram),
|
||||
MAKE_SERVICE_COMMAND_META(TerminateProcess),
|
||||
MAKE_SERVICE_COMMAND_META(TerminateTitle),
|
||||
MAKE_SERVICE_COMMAND_META(TerminateProgram),
|
||||
MAKE_SERVICE_COMMAND_META(GetProcessEventHandle),
|
||||
MAKE_SERVICE_COMMAND_META(GetProcessEventInfo),
|
||||
MAKE_SERVICE_COMMAND_META(NotifyBootFinished),
|
||||
|
@ -74,9 +74,9 @@ namespace ams::pm::shell {
|
|||
class ShellServiceDeprecated final : public ShellServiceBase {
|
||||
private:
|
||||
enum class CommandId {
|
||||
LaunchTitle = 0,
|
||||
LaunchProgram = 0,
|
||||
TerminateProcess = 1,
|
||||
TerminateTitle = 2,
|
||||
TerminateProgram = 2,
|
||||
GetProcessEventHandle = 3,
|
||||
GetProcessEventInfo = 4,
|
||||
CleanupProcess = 5,
|
||||
|
@ -88,9 +88,9 @@ namespace ams::pm::shell {
|
|||
public:
|
||||
DEFINE_SERVICE_DISPATCH_TABLE {
|
||||
/* 1.0.0-4.1.0 */
|
||||
MAKE_SERVICE_COMMAND_META(LaunchTitle),
|
||||
MAKE_SERVICE_COMMAND_META(LaunchProgram),
|
||||
MAKE_SERVICE_COMMAND_META(TerminateProcess),
|
||||
MAKE_SERVICE_COMMAND_META(TerminateTitle),
|
||||
MAKE_SERVICE_COMMAND_META(TerminateProgram),
|
||||
MAKE_SERVICE_COMMAND_META(GetProcessEventHandle),
|
||||
MAKE_SERVICE_COMMAND_META(GetProcessEventInfo),
|
||||
MAKE_SERVICE_COMMAND_META(CleanupProcess),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue