Пример #1
0
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;
}
Пример #2
0
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);
}