// Copyright 2017 plutoo #include static Handle g_pmdmntHandle = INVALID_HANDLE; Result pmdmntInitialize() { Result rc = smGetService(&g_pmdmntHandle, "pm:dmnt"); if (R_FAILED(rc)) { g_pmdmntHandle = INVALID_HANDLE; } return rc; } Result pmdmntStartProcess(u64 pid) { IpcCommand c; ipcInitialize(&c); struct { u64 magic; u64 cmd_id; u64 pid; } *raw; raw = ipcPrepareHeader(&c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 2; raw->pid = pid; Result rc = ipcDispatch(g_pmdmntHandle); if (R_SUCCEEDED(rc)) { IpcCommandResponse r; ipcParseResponse(&r); struct { u64 magic; u64 result; } *resp = r.Raw; rc = resp->result; } return rc; } Result pmdmntGetTitlePid(u64* pid_out, u64 title_id) { IpcCommand c; ipcInitialize(&c); struct { u64 magic; u64 cmd_id; u64 title_id; } *raw; raw = ipcPrepareHeader(&c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 3; raw->title_id = title_id; Result rc = ipcDispatch(g_pmdmntHandle); if (R_SUCCEEDED(rc)) { IpcCommandResponse r; ipcParseResponse(&r); struct { u64 magic; u64 result; u64 pid; } *resp = r.Raw; rc = resp->result; if (R_SUCCEEDED(rc)) { *pid_out = resp->pid; } } return rc; } Result pmdmntEnableDebugForTitleId(Handle* handle_out, u64 title_id) { IpcCommand c; ipcInitialize(&c); struct { u64 magic; u64 cmd_id; u64 title_id; } *raw; raw = ipcPrepareHeader(&c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 4; raw->title_id = title_id; Result rc = ipcDispatch(g_pmdmntHandle); if (R_SUCCEEDED(rc)) { IpcCommandResponse r; ipcParseResponse(&r); struct { u64 magic; u64 result; } *resp = r.Raw; rc = resp->result; if (R_SUCCEEDED(rc)) { *handle_out = r.Handles[0]; } } return rc; } Result pmdmntGetApplicationPid(u64* pid_out) { IpcCommand c; ipcInitialize(&c); struct { u64 magic; u64 cmd_id; } *raw; raw = ipcPrepareHeader(&c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 5; Result rc = ipcDispatch(g_pmdmntHandle); if (R_SUCCEEDED(rc)) { IpcCommandResponse r; ipcParseResponse(&r); struct { u64 magic; u64 result; u64 pid; } *resp = r.Raw; rc = resp->result; if (R_SUCCEEDED(rc)) { *pid_out = resp->pid; } } return rc; } Result pmdmntEnableDebugForApplication(Handle* handle_out) { IpcCommand c; ipcInitialize(&c); struct { u64 magic; u64 cmd_id; } *raw; raw = ipcPrepareHeader(&c, sizeof(*raw)); raw->magic = SFCI_MAGIC; raw->cmd_id = 6; Result rc = ipcDispatch(g_pmdmntHandle); if (R_SUCCEEDED(rc)) { IpcCommandResponse r; ipcParseResponse(&r); struct { u64 magic; u64 result; } *resp = r.Raw; rc = resp->result; if (R_SUCCEEDED(rc)) { *handle_out = r.Handles[0]; } } return rc; }