diff --git a/nx/source/services/ldr.c b/nx/source/services/ldr.c index e2fb271a..8271577d 100644 --- a/nx/source/services/ldr.c +++ b/nx/source/services/ldr.c @@ -24,7 +24,7 @@ LDR_GENERATE_SERVICE_INIT(Shell, shel); LDR_GENERATE_SERVICE_INIT(Dmnt, dmnt); LDR_GENERATE_SERVICE_INIT(Pm, pm); -static Result _ldrSetProgramArguments(Service* srv, u64 program_id, const void *args, size_t args_size) { +static Result _ldrSetProgramArgumentsDeprecated(Service* srv, u64 program_id, const void *args, size_t args_size) { const struct { u32 args_size; u32 pad; @@ -37,6 +37,21 @@ static Result _ldrSetProgramArguments(Service* srv, u64 program_id, const void * ); } +static Result _ldrSetProgramArgumentsModern(Service* srv, u64 program_id, const void *args, size_t args_size) { + return serviceDispatchIn(srv, 0, program_id, + .buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcPointer }, + .buffers = { { args, args_size } }, + ); +} + +static Result _ldrSetProgramArguments(Service* srv, u64 program_id, const void *args, size_t args_size) { + if (hosversionAtLeast(11,0,0)) { + return _ldrSetProgramArgumentsModern(srv, program_id, args, args_size); + } else { + return _ldrSetProgramArgumentsDeprecated(srv, program_id, args, args_size); + } +} + static Result _ldrFlushArguments(Service* srv) { return serviceDispatch(srv, 1); }