diff --git a/libctru/include/ctr/APT.h b/libctru/include/ctr/APT.h index a6aa819..c5dfc0d 100644 --- a/libctru/include/ctr/APT.h +++ b/libctru/include/ctr/APT.h @@ -14,6 +14,8 @@ Result APT_Enable(Handle handle, u32 a); Result APT_PrepareToJumpToHomeMenu(Handle handle); Result APT_JumpToHomeMenu(Handle handle, u32 a, u32 b, u32 c); Result APT_InquireNotification(Handle handle, u32 appID, u8* signalType); -Result APT_NotifyToWait(Handle handle, u32 a); +Result APT_NotifyToWait(Handle handle, NS_APPID appID); +Result APT_GlanceParameter(Handle handle, NS_APPID appID, u32 bufferSize, u32* buffer, u32* actualSize); +Result APT_ReceiveParameter(Handle handle, NS_APPID appID, u32 bufferSize, u32* buffer, u32* actualSize); #endif diff --git a/libctru/source/APT.c b/libctru/source/APT.c index 71d82cd..d1e87e4 100644 --- a/libctru/source/APT.c +++ b/libctru/source/APT.c @@ -87,14 +87,50 @@ Result APT_JumpToHomeMenu(Handle handle, u32 a, u32 b, u32 c) return cmdbuf[1]; } -Result APT_NotifyToWait(Handle handle, u32 a) +Result APT_NotifyToWait(Handle handle, NS_APPID appID) { u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x430040; //request header code - cmdbuf[1]=a; + cmdbuf[1]=appID; Result ret=0; if((ret=svc_sendSyncRequest(handle)))return ret; return cmdbuf[1]; } + +Result APT_GlanceParameter(Handle handle, NS_APPID appID, u32 bufferSize, u32* buffer, u32* actualSize) +{ + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0xE0080; //request header code + cmdbuf[1]=appID; + cmdbuf[2]=bufferSize; + + cmdbuf[0+0x100/4]=(bufferSize<<14)|2; + cmdbuf[1+0x100/4]=(u32)buffer; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + if(actualSize)*actualSize=cmdbuf[4]; + + return cmdbuf[1]; +} + +Result APT_ReceiveParameter(Handle handle, NS_APPID appID, u32 bufferSize, u32* buffer, u32* actualSize) +{ + u32* cmdbuf=getThreadCommandBuffer(); + cmdbuf[0]=0xD0080; //request header code + cmdbuf[1]=appID; + cmdbuf[2]=bufferSize; + + cmdbuf[0+0x100/4]=(bufferSize<<14)|2; + cmdbuf[1+0x100/4]=(u32)buffer; + + Result ret=0; + if((ret=svc_sendSyncRequest(handle)))return ret; + + if(actualSize)*actualSize=cmdbuf[4]; + + return cmdbuf[1]; +} diff --git a/libctru/source/svc.s b/libctru/source/svc.s index fdc5739..ff6f4a3 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -87,13 +87,13 @@ svc_waitSynchronization1: .global svc_waitSynchronizationN .type svc_waitSynchronizationN, %function svc_waitSynchronizationN: - stmfd sp!, {r5} + str r5, [sp, #-4]! mov r5, r0 ldr r0, [sp, #0x4] ldr r4, [sp, #0x4+0x4] svc 0x25 str r1, [r5] - ldmfd sp!, {r5} + ldr r5, [sp], #4 bx lr .global svc_connectToPort