From a0ebe68f54cc0ba9503abae70d8775cdb80eb64e Mon Sep 17 00:00:00 2001 From: yellows8 Date: Mon, 11 Dec 2017 19:18:45 -0500 Subject: [PATCH] Implemented actual args handling in __system_initArgv(). --- nx/source/system/initArgv.c | 97 ++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/nx/source/system/initArgv.c b/nx/source/system/initArgv.c index ab8d4768..6a3d5815 100644 --- a/nx/source/system/initArgv.c +++ b/nx/source/system/initArgv.c @@ -1,6 +1,7 @@ #include #include +#include // System globals we define here int __system_argc; @@ -9,12 +10,106 @@ char** __system_argv; extern char* fake_heap_start; extern char* fake_heap_end; +extern u32 __argdata__; + void __system_initArgv(void) { - //TODO: How to load args? + Result rc=0; + MemInfo meminfo; + u32 pageinfo=0; + + u8 *argdata = (u8*)&__argdata__; + u32 *arg32 = (u32*)argdata; + u32 argdata_allocsize; + u32 argdata_strsize; + u32 argvptr_pos; + u32 max_argv; + u32 argi; + u32 arglen=0; + bool quote_flag=0; + bool end_flag=0; + char *args; + char *argstart; + char *argstorage; + __system_argc = 0; __system_argv = NULL; + rc = svcQueryMemory(&meminfo, &pageinfo, (u64)argdata); + if (R_FAILED(rc) || meminfo.perm!=0x3) return; //This memory is only mapped when arguments were passed. + + argdata_allocsize = arg32[0]; + argdata_strsize = arg32[1]; + args = (char*)&argdata[0x20]; + + if (argdata_allocsize==0 || argdata_strsize==0) return; + + argvptr_pos = 0x20 + argdata_strsize+1; + if (argvptr_pos >= argdata_allocsize) return; + argstorage = (char*)&argdata[argvptr_pos]; + + argvptr_pos += (argdata_strsize+1 + 0x9) & ~0x7; + if (argvptr_pos >= argdata_allocsize) return; + + max_argv = (argdata_allocsize - argvptr_pos) >> 3; + if (max_argv < 2) return; + + __system_argv = (char**)&argdata[argvptr_pos]; + + argstart = NULL; + + for(argi=0; argi= max_argv) break; + } + } + } + + if (arglen && __system_argc < max_argv) { + strncpy(argstorage, argstart, arglen); + argstorage[arglen] = 0; + __system_argv[__system_argc] = argstorage; + __system_argc++; + } + + __system_argv[__system_argc] = NULL; + + //TODO: How to handle args for NRO? + /* int i; const char* arglist = envGetSystemArgList();