diff --git a/include/stratosphere/services/smm_ams.h b/include/stratosphere/services/smm_ams.h index 85973929..d5f58775 100644 --- a/include/stratosphere/services/smm_ams.h +++ b/include/stratosphere/services/smm_ams.h @@ -25,6 +25,7 @@ Result smManagerAmsInitialize(void); void smManagerAmsExit(void); Result smManagerAmsEndInitialDefers(void); +Result smManagerAmsHasMitm(bool *out, const char* name); #ifdef __cplusplus } diff --git a/source/smm_ams.c b/source/smm_ams.c index 2ac9e4e6..71cde5fe 100644 --- a/source/smm_ams.c +++ b/source/smm_ams.c @@ -66,4 +66,42 @@ Result smManagerAmsEndInitialDefers(void) { return rc; -} \ No newline at end of file +} + +Result smManagerAmsHasMitm(bool *out, const char* name) { + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + u64 service_name; + } *raw; + + raw = serviceIpcPrepareHeader(&g_smManagerAmsSrv, &c, sizeof(*raw)); + raw->magic = SFCI_MAGIC; + raw->cmd_id = 65001; + raw->service_name = smEncodeName(name); + + Result rc = serviceIpcDispatch(&g_smManagerAmsSrv); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + u8 has_mitm; + } *resp; + + serviceIpcParse(&g_smManagerAmsSrv, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *out = has_mitm != 0; + } + } + + return rc; +}