diff --git a/libctru/include/3ds/svc.h b/libctru/include/3ds/svc.h index 58969ab..9d4dcf6 100644 --- a/libctru/include/3ds/svc.h +++ b/libctru/include/3ds/svc.h @@ -42,6 +42,7 @@ s32 svcUnmapMemoryBlock(Handle memblock, u32 addr); s32 svcWaitSynchronization(Handle handle, s64 nanoseconds); s32 svcWaitSynchronizationN(s32* out, Handle* handles, s32 handles_num, bool wait_all, s64 nanoseconds); s32 svcCloseHandle(Handle handle); +s32 svcDuplicateHandle(Handle* out, Handle original); u64 svcGetSystemTick(); s32 svcGetSystemInfo(s64* out, u32 type, s32 param); s32 svcGetProcessInfo(s64* out, Handle process, u32 type); diff --git a/libctru/source/srv.c b/libctru/source/srv.c index 39aff8e..5edfecb 100644 --- a/libctru/source/srv.c +++ b/libctru/source/srv.c @@ -107,7 +107,7 @@ Result srvGetServiceHandle(Handle* out, char* name) Handle h = __get_handle_from_list(name); if(h != 0) { - *out = h; return 0; + return svcDuplicateHandle(out, h); } #endif diff --git a/libctru/source/svc.s b/libctru/source/svc.s index f3601a7..1969ddc 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -134,6 +134,15 @@ svcWaitSynchronizationN: ldr r5, [sp], #4 bx lr +.global svcDuplicateHandle +.type svcDuplicateHandle, %function +svcDuplicateHandle: + str r0, [sp,#-0x4]! + svc 0x27 + ldr r3, [sp], #4 + str r1, [r3] + bx lr + .global svcGetSystemTick .type svcGetSystemTick, %function svcGetSystemTick: