void HB_Load3dsx(u32* cmdbuf) { if(!cmdbuf)return; if(cmdbuf[0] != 0x50042 || cmdbuf[2] != 0) { //send error cmdbuf[0]=0x00050040; cmdbuf[1]=0xFFFFFFFF; return; } // const void* baseAddr=(void*)cmdbuf[1]; const void* baseAddr=(void*)CN_3DSX_LOADADR; const Handle fileHandle=cmdbuf[3]; u32 heapAddr=cmdbuf[1]; Result ret; ret=svc_mapProcessMemory(targetProcessHandle, 0x00100000, 0x02000000); if(!ret) { memset((void*)CN_3DSX_LOADADR, 0x00, (0x00100000+CN_NEWTOTALPAGES*0x1000)-CN_3DSX_LOADADR); ret=Load3DSX(fileHandle, targetProcessHandle, (void*)baseAddr, heapAddr); svc_unmapProcessMemory(targetProcessHandle, 0x00100000, 0x02000000); } svc_closeHandle(fileHandle); cmdbuf[0]=0x00050040; cmdbuf[1]=ret; }
void setup3dsx(Handle executable, memorymap_t* m, service_list_t* serviceList, u32* argbuf) { if(!m)return; Result ret = Load3DSX(executable, (void*)(0x00100000 + 0x00008000), (void*)m->header.data_address, m->header.data_size, serviceList, argbuf); apply_map(m); // sleep for 50ms svc_sleepThread(50*1000*1000); }