ncm/pm: Added NcmProgramLocation, which is now used by pmshellLaunchProgram (which was renamed). Updated pm names to match wiki. Adjusted order in pm.c/pm.h / minor changes.

This commit is contained in:
yellows8 2019-10-24 16:42:52 -04:00
parent 0d5e51757d
commit a808c53efc
No known key found for this signature in database
GPG Key ID: 0AF90DA3F1E60E43
3 changed files with 68 additions and 51 deletions

View File

@ -132,6 +132,13 @@ typedef struct {
u8 pad[7]; ///< [3.0.0+]
} NcmRightsId;
/// ProgramLocation
typedef struct {
u64 titleID;
u8 storageID; ///< \ref FsStorageId
u8 pad[7];
} NcmProgramLocation;
Result ncmInitialize(void);
void ncmExit(void);
Service* ncmGetServiceSession(void);

View File

@ -10,6 +10,7 @@
#include "../types.h"
#include "../kernel/event.h"
#include "../sf/service.h"
#include "../services/ncm.h"
/// LaunchFlag
typedef enum {
@ -76,28 +77,6 @@ void pmbmExit();
Service* pmbmGetServiceSession(void);
Result pmdmntGetDebugProcesses(u32* out_count, u64* out_pids, size_t max_pids);
Result pmdmntStartProcess(u64 pid);
Result pmdmntGetTitlePid(u64* pid_out, u64 title_id);
Result pmdmntEnableDebugForTitleId(Event* out, u64 title_id);
Result pmdmntGetApplicationPid(u64* pid_out);
Result pmdmntEnableDebugForApplication(Event* out);
Result pmdmntDisableDebug(u32 which);
Result pminfoGetTitleId(u64* title_id_out, u64 pid);
Result pmshellLaunchProcess(u32 launch_flags, u64 titleID, u64 storageID, u64 *pid);
Result pmshellTerminateProcessByProcessId(u64 processID);
Result pmshellTerminateProcessByTitleId(u64 titleID);
Result pmshellGetProcessEvent(Event* out); // Autoclear for pmshellProcessEvent is always true.
Result pmshellGetProcessEventInfo(PmProcessEventInfo* out);
Result pmshellFinalizeDeadProcess(u64 pid);
Result pmshellClearProcessExceptionOccurred(u64 pid);
Result pmshellNotifyBootFinished(void);
Result pmshellGetApplicationPid(u64* pid_out);
Result pmshellBoostSystemMemoryResourceLimit(u64 boost_size);
Result pmshellBoostSystemThreadResourceLimit(void);
/**
* @brief Gets the \ref PmBootMode.
* @param[out] out \ref PmBootMode
@ -108,3 +87,25 @@ Result pmbmGetBootMode(PmBootMode *out);
* @brief Sets the \ref PmBootMode to ::PmBootMode_Maintenance.
*/
Result pmbmSetMaintenanceBoot(void);
Result pmdmntGetJitDebugProcessIdList(u32* out_count, u64* out_pids, size_t max_pids);
Result pmdmntStartProcess(u64 pid);
Result pmdmntGetProcessId(u64* pid_out, u64 title_id);
Result pmdmntHookToCreateProcess(Event* out, u64 title_id);
Result pmdmntGetApplicationProcessId(u64* pid_out);
Result pmdmntHookToCreateApplicationProcess(Event* out);
Result pmdmntClearHook(u32 which);
Result pminfoGetProgramId(u64* title_id_out, u64 pid);
Result pmshellLaunchProgram(u32 launch_flags, NcmProgramLocation *location, u64 *pid);
Result pmshellTerminateProcess(u64 processID);
Result pmshellTerminateProgram(u64 titleID);
Result pmshellGetProcessEventHandle(Event* out); // Autoclear for pmshellProcessEvent is always true.
Result pmshellGetProcessEventInfo(PmProcessEventInfo* out);
Result pmshellCleanupProcess(u64 pid);
Result pmshellClearJitDebugOccured(u64 pid);
Result pmshellNotifyBootFinished(void);
Result pmshellGetApplicationProcessIdForShell(u64* pid_out);
Result pmshellBoostSystemMemoryResourceLimit(u64 boost_size);
Result pmshellBoostSystemThreadResourceLimit(void);

View File

@ -3,6 +3,7 @@
#include "service_guard.h"
#include "runtime/hosversion.h"
#include "services/pm.h"
#include "services/ncm.h"
#define PM_GENERATE_SERVICE_INIT(name) \
static Service g_pm##name##Srv; \
@ -26,7 +27,20 @@ PM_GENERATE_SERVICE_INIT(shell);
PM_GENERATE_SERVICE_INIT(info);
PM_GENERATE_SERVICE_INIT(bm);
Result pmdmntGetDebugProcesses(u32* out_count, u64* out_pids, size_t max_pids) {
// pmbm
Result pmbmGetBootMode(PmBootMode *out) {
_Static_assert(sizeof(*out) == sizeof(u32), "PmBootMode");
return serviceDispatchOut(&g_pmbmSrv, 0, *out);
}
Result pmbmSetMaintenanceBoot(void) {
return serviceDispatch(&g_pmbmSrv, 1);
}
// pmdmnt
Result pmdmntGetJitDebugProcessIdList(u32* out_count, u64* out_pids, size_t max_pids) {
const u64 cmd_id = hosversionAtLeast(5,0,0) ? 0 : 1;
return serviceDispatchOut(&g_pmdmntSrv, cmd_id, *out_count,
.buffer_attrs = {
@ -43,12 +57,12 @@ Result pmdmntStartProcess(u64 pid) {
return serviceDispatchIn(&g_pmdmntSrv, cmd_id, pid);
}
Result pmdmntGetTitlePid(u64* pid_out, u64 title_id) {
Result pmdmntGetProcessId(u64* pid_out, u64 title_id) {
const u64 cmd_id = hosversionAtLeast(5,0,0) ? 2 : 3;
return serviceDispatchInOut(&g_pmdmntSrv, cmd_id, title_id, *pid_out);
}
Result pmdmntEnableDebugForTitleId(Event* out_event, u64 title_id) {
Result pmdmntHookToCreateProcess(Event* out_event, u64 title_id) {
const u64 cmd_id = hosversionAtLeast(5,0,0) ? 3 : 4;
Handle event = INVALID_HANDLE;
Result rc = serviceDispatchIn(&g_pmdmntSrv, cmd_id, title_id,
@ -60,12 +74,12 @@ Result pmdmntEnableDebugForTitleId(Event* out_event, u64 title_id) {
return rc;
}
Result pmdmntGetApplicationPid(u64* pid_out) {
Result pmdmntGetApplicationProcessId(u64* pid_out) {
const u64 cmd_id = hosversionAtLeast(5,0,0) ? 4 : 5;
return serviceDispatchOut(&g_pmdmntSrv, cmd_id, *pid_out);
}
Result pmdmntEnableDebugForApplication(Event* out_event) {
Result pmdmntHookToCreateApplicationProcess(Event* out_event) {
const u64 cmd_id = hosversionAtLeast(5,0,0) ? 5 : 6;
Handle event = INVALID_HANDLE;
Result rc = serviceDispatch(&g_pmdmntSrv, cmd_id,
@ -77,29 +91,37 @@ Result pmdmntEnableDebugForApplication(Event* out_event) {
return rc;
}
Result pmdmntDisableDebug(u32 which) {
Result pmdmntClearHook(u32 which) {
if (hosversionBefore(6,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return serviceDispatchIn(&g_pmdmntSrv, 6, which);
}
Result pmshellLaunchProcess(u32 launch_flags, u64 titleID, u64 storageID, u64 *pid) {
// pminfo
Result pminfoGetProgramId(u64* title_id_out, u64 pid) {
return serviceDispatchInOut(&g_pminfoSrv, 0, pid, *title_id_out);
}
// pmshell
Result pmshellLaunchProgram(u32 launch_flags, NcmProgramLocation *location, u64 *pid) {
const struct {
u32 launch_flags;
u64 titleID;
u64 storageID;
} in = { launch_flags, titleID, storageID };
u32 pad;
NcmProgramLocation location;
} in = { launch_flags, 0, *location };
return serviceDispatchInOut(&g_pmshellSrv, 0, in, *pid);
}
Result pmshellTerminateProcessByProcessId(u64 processID) {
Result pmshellTerminateProcess(u64 processID) {
return serviceDispatchIn(&g_pmshellSrv, 1, processID);
}
Result pmshellTerminateProcessByTitleId(u64 titleID) {
Result pmshellTerminateProgram(u64 titleID) {
return serviceDispatchIn(&g_pmshellSrv, 2, titleID);
}
Result pmshellGetProcessEvent(Event* out_event) {
Result pmshellGetProcessEventHandle(Event* out_event) {
Handle event = INVALID_HANDLE;
Result rc = serviceDispatch(&g_pmshellSrv, 3,
.out_handle_attrs = { SfOutHandleAttr_HipcCopy },
@ -115,12 +137,12 @@ Result pmshellGetProcessEventInfo(PmProcessEventInfo* out) {
return serviceDispatchOut(&g_pmshellSrv, 4, *out);
}
Result pmshellFinalizeDeadProcess(u64 pid) {
Result pmshellCleanupProcess(u64 pid) {
if (hosversionAtLeast(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return serviceDispatchIn(&g_pmshellSrv, 5, pid);
}
Result pmshellClearProcessExceptionOccurred(u64 pid) {
Result pmshellClearJitDebugOccured(u64 pid) {
if (hosversionAtLeast(5,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return serviceDispatchIn(&g_pmshellSrv, 6, pid);
}
@ -130,7 +152,7 @@ Result pmshellNotifyBootFinished(void) {
return serviceDispatch(&g_pmshellSrv, cmd_id);
}
Result pmshellGetApplicationPid(u64* pid_out) {
Result pmshellGetApplicationProcessIdForShell(u64* pid_out) {
const u64 cmd_id = hosversionAtLeast(5,0,0) ? 6 : 8;
return serviceDispatchOut(&g_pmshellSrv, cmd_id, *pid_out);
}
@ -145,16 +167,3 @@ Result pmshellBoostSystemThreadResourceLimit(void) {
if (hosversionBefore(7,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
return serviceDispatch(&g_pmshellSrv, 8);
}
Result pminfoGetTitleId(u64* title_id_out, u64 pid) {
return serviceDispatchInOut(&g_pminfoSrv, 0, pid, *title_id_out);
}
Result pmbmGetBootMode(PmBootMode *out) {
_Static_assert(sizeof(*out) == sizeof(u32), "PmBootMode");
return serviceDispatchOut(&g_pmbmSrv, 0, *out);
}
Result pmbmSetMaintenanceBoot(void) {
return serviceDispatch(&g_pmbmSrv, 1);
}