diff --git a/source/KeyCollection.cpp b/source/KeyCollection.cpp index 48ca9d9..897eb5b 100644 --- a/source/KeyCollection.cpp +++ b/source/KeyCollection.cpp @@ -592,7 +592,7 @@ void KeyCollection::get_titlekeys() { esInitialize(); esCountCommonTicket(&common_count); esCountPersonalizedTicket(&personalized_count); - NcmNcaId common_rights_ids[common_count], personalized_rights_ids[personalized_count]; + NcmRightsId common_rights_ids[common_count], personalized_rights_ids[personalized_count]; esListCommonTicket(&ids_written, common_rights_ids, sizeof(common_rights_ids)); esListPersonalizedTicket(&ids_written, personalized_rights_ids, sizeof(personalized_rights_ids)); esExit(); @@ -608,13 +608,13 @@ void KeyCollection::get_titlekeys() { std::unordered_set rights_ids; for (size_t i = 0; i < common_count; i++) { for (size_t j = 0; j < 0x10; j++) { - sprintf(&rights_id_string[j*2], "%02x", common_rights_ids[i].c[j]); + sprintf(&rights_id_string[j*2], "%02x", common_rights_ids[i].rights_id.c[j]); } rights_ids.insert(rights_id_string); } for (size_t i = 0; i < personalized_count; i++) { for (size_t j = 0; j < 0x10; j++) { - sprintf(&rights_id_string[j*2], "%02x", personalized_rights_ids[i].c[j]); + sprintf(&rights_id_string[j*2], "%02x", personalized_rights_ids[i].rights_id.c[j]); } rights_ids.insert(rights_id_string); } diff --git a/source/KeyLocation.cpp b/source/KeyLocation.cpp index 27526c9..ba5cee7 100644 --- a/source/KeyLocation.cpp +++ b/source/KeyLocation.cpp @@ -30,7 +30,7 @@ void KeyLocation::get_from_memory(u64 tid, u8 seg_mask) { // if not a kernel process, get pid from pm:dmnt if ((tid > 0x0100000000000005) && (tid != 0x0100000000000028)) { u64 pid; - pmdmntGetTitlePid(&pid, tid); + pmdmntGetProcessId(&pid, tid); if (R_FAILED(svcDebugActiveProcess(&debug_handle, pid)) || R_FAILED(svcGetDebugEvent(reinterpret_cast(&d), debug_handle))) diff --git a/source/nx/es.c b/source/nx/es.c index 0ebdbc8..fbd7dca 100644 --- a/source/nx/es.c +++ b/source/nx/es.c @@ -1,170 +1,72 @@ #include "es.h" -#include +#include "../service_guard.h" + #include #include static Service g_esSrv; -static u64 g_esRefCnt; -Result esInitialize() { - atomicIncrement64(&g_esRefCnt); - - if (serviceIsActive(&g_esSrv)) - return 0; +NX_GENERATE_SERVICE_GUARD(es); +Result _esInitialize() { return smGetService(&g_esSrv, "es"); } -void esExit() -{ - if (atomicDecrement64(&g_esRefCnt) == 0) { - serviceClose(&g_esSrv); - } +void _esCleanup() { + serviceClose(&g_esSrv); } Result esCountCommonTicket(u32 *num_tickets) { - IpcCommand c; - ipcInitialize(&c); - struct { - u64 magic; - u64 cmd_id; - } *raw; + u32 num_tickets; + } out; - raw = ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 9; - - Result rc = serviceIpcDispatch(&g_esSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct { - u64 magic; - u64 result; - u32 num_tickets; - } *resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - *num_tickets = resp->num_tickets; - } - } + Result rc = serviceDispatchOut(&g_esSrv, 9, out); + if (R_SUCCEEDED(rc) && num_tickets) *num_tickets = out.num_tickets; return rc; } Result esCountPersonalizedTicket(u32 *num_tickets) { - IpcCommand c; - ipcInitialize(&c); - struct { - u64 magic; - u64 cmd_id; - } *raw; + u32 num_tickets; + } out; - raw = ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 10; - - Result rc = serviceIpcDispatch(&g_esSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct { - u64 magic; - u64 result; - u32 num_tickets; - } *resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - *num_tickets = resp->num_tickets; - } - } + Result rc = serviceDispatchOut(&g_esSrv, 10, out); + if (R_SUCCEEDED(rc) && num_tickets) *num_tickets = out.num_tickets; return rc; } -Result esListCommonTicket(u32 *numRightsIdsWritten, NcmNcaId *outBuf, size_t bufSize) { - IpcCommand c; - ipcInitialize(&c); - ipcAddRecvBuffer(&c, outBuf, bufSize, BufferType_Normal); - +Result esListCommonTicket(u32 *numRightsIdsWritten, NcmRightsId *outBuf, size_t bufSize) +{ struct { - u64 magic; - u64 cmd_id; - } *raw; + u32 num_rights_ids_written; + } out; - raw = ipcPrepareHeader(&c, sizeof(*raw)); - raw->magic = SFCI_MAGIC; - raw->cmd_id = 11; - - Result rc = serviceIpcDispatch(&g_esSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct { - u64 magic; - u64 result; - u32 num_rights_ids_written; - } *resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - if (numRightsIdsWritten) *numRightsIdsWritten = resp->num_rights_ids_written; - } - } + Result rc = serviceDispatchInOut(&g_esSrv, 11, *numRightsIdsWritten, out, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { outBuf, bufSize } }, + ); + if (R_SUCCEEDED(rc) && numRightsIdsWritten) *numRightsIdsWritten = out.num_rights_ids_written; return rc; } -Result esListPersonalizedTicket(u32 *numRightsIdsWritten, NcmNcaId *outBuf, size_t bufSize) { - IpcCommand c; - ipcInitialize(&c); - ipcAddRecvBuffer(&c, outBuf, bufSize, BufferType_Normal); - +Result esListPersonalizedTicket(u32 *numRightsIdsWritten, NcmRightsId *outBuf, size_t bufSize) +{ struct { - u64 magic; - u64 cmd_id; - } *raw; + u32 num_rights_ids_written; + } out; - raw = ipcPrepareHeader(&c, sizeof(*raw)); - raw->magic = SFCI_MAGIC; - raw->cmd_id = 12; - - Result rc = serviceIpcDispatch(&g_esSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct { - u64 magic; - u64 result; - u32 num_rights_ids_written; - } *resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - if (numRightsIdsWritten) *numRightsIdsWritten = resp->num_rights_ids_written; - } - } + Result rc = serviceDispatchInOut(&g_esSrv, 12, *numRightsIdsWritten, out, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { outBuf, bufSize } }, + ); + if (R_SUCCEEDED(rc) && numRightsIdsWritten) *numRightsIdsWritten = out.num_rights_ids_written; return rc; } \ No newline at end of file diff --git a/source/nx/es.h b/source/nx/es.h index 212e199..f1ad03a 100644 --- a/source/nx/es.h +++ b/source/nx/es.h @@ -8,5 +8,5 @@ void esExit(); Result esCountCommonTicket(u32 *num_tickets); //9 Result esCountPersonalizedTicket(u32 *num_tickets); // 10 -Result esListCommonTicket(u32 *numRightsIdsWritten, NcmNcaId *outBuf, size_t bufSize); -Result esListPersonalizedTicket(u32 *numRightsIdsWritten, NcmNcaId *outBuf, size_t bufSize); \ No newline at end of file +Result esListCommonTicket(u32 *numRightsIdsWritten, NcmRightsId *outBuf, size_t bufSize); +Result esListPersonalizedTicket(u32 *numRightsIdsWritten, NcmRightsId *outBuf, size_t bufSize); \ No newline at end of file diff --git a/source/nx/set_ext.c b/source/nx/set_ext.c index 4d0d618..2ccef6c 100644 --- a/source/nx/set_ext.c +++ b/source/nx/set_ext.c @@ -1,55 +1,26 @@ #include "set_ext.h" -#include +#include "../service_guard.h" + #include #include static Service g_setcalSrv; -static u64 g_refCntCal; -Result setcalInitialize(void) { - atomicIncrement64(&g_refCntCal); - - if (serviceIsActive(&g_setcalSrv)) - return MAKERESULT(Module_Libnx, LibnxError_AlreadyInitialized); +NX_GENERATE_SERVICE_GUARD(setcal); +Result _setcalInitialize() { return smGetService(&g_setcalSrv, "set:cal"); } -void setcalExit(void) { - if (atomicDecrement64(&g_refCntCal) == 0) { - serviceClose(&g_setcalSrv); - } +void _setcalCleanup() { + serviceClose(&g_setcalSrv); } -Result setcalGetEticketDeviceKey(void *key) { - IpcCommand c; - ipcInitialize(&c); - ipcAddRecvBuffer(&c, key, 0x244, 0); - - struct { - u64 magic; - u64 cmd_id; - } *raw; - - raw = ipcPrepareHeader(&c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 21; - - Result rc = serviceIpcDispatch(&g_setcalSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - ipcParse(&r); - - struct { - u64 magic; - u64 result; - } *resp = r.Raw; - - rc = resp->result; - } - - return rc; +Result setcalGetEticketDeviceKey(void *key) +{ + return serviceDispatch(&g_setcalSrv, 21, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, + .buffers = { { key, 0x244 } }, + ); } \ No newline at end of file diff --git a/source/service_guard.h b/source/service_guard.h new file mode 100644 index 0000000..567abfc --- /dev/null +++ b/source/service_guard.h @@ -0,0 +1,56 @@ +#pragma once +#include +#include +#include +#include +#include + +typedef struct ServiceGuard { + Mutex mutex; + u32 refCount; +} ServiceGuard; + +NX_INLINE bool serviceGuardBeginInit(ServiceGuard* g) +{ + mutexLock(&g->mutex); + return (g->refCount++) == 0; +} + +NX_INLINE Result serviceGuardEndInit(ServiceGuard* g, Result rc, void (*cleanupFunc)(void)) +{ + if (R_FAILED(rc)) { + cleanupFunc(); + --g->refCount; + } + mutexUnlock(&g->mutex); + return rc; +} + +NX_INLINE void serviceGuardExit(ServiceGuard* g, void (*cleanupFunc)(void)) +{ + mutexLock(&g->mutex); + if (g->refCount && (--g->refCount) == 0) + cleanupFunc(); + mutexUnlock(&g->mutex); +} + +#define NX_GENERATE_SERVICE_GUARD_PARAMS(name, _paramdecl, _parampass) \ +\ +static ServiceGuard g_##name##Guard; \ +NX_INLINE Result _##name##Initialize _paramdecl; \ +static void _##name##Cleanup(void); \ +\ +Result name##Initialize _paramdecl \ +{ \ + Result rc = 0; \ + if (serviceGuardBeginInit(&g_##name##Guard)) \ + rc = _##name##Initialize _parampass; \ + return serviceGuardEndInit(&g_##name##Guard, rc, _##name##Cleanup); \ +} \ +\ +void name##Exit(void) \ +{ \ + serviceGuardExit(&g_##name##Guard, _##name##Cleanup); \ +} + +#define NX_GENERATE_SERVICE_GUARD(name) NX_GENERATE_SERVICE_GUARD_PARAMS(name, (void), ())