void gspGpuExit() { GSPGPU_UnregisterInterruptRelayQueue(NULL); //unmap GSP shared mem svc_unmapMemoryBlock(gspSharedMemHandle, 0x10002000); svc_closeHandle(gspSharedMemHandle); svc_closeHandle(gspEvent); gspExit(); //free GSP heap svc_controlMemory((u32*)&gspHeap, (u32)gspHeap, 0x0, 0x2000000, MEMOP_FREE, 0x0); }
void hidExit() { svc_unmapMemoryBlock(hidMemHandle, (u32)hidSharedMem); svc_closeHandle(hidMemHandle); svc_closeHandle(hidHandle); }
void changeProcess(int processId, u32* argbuf, u32 argbuflength) { initSrv(); gspGpuInit(); // free extra data pages if any freeDataPages(0x14000000); freeDataPages(0x30000000); // allocate gsp heap svc_controlMemory((u32*)&gspHeap, 0x0, 0x0, 0x01000000, 0x10003, 0x3); patchMenuRop(processId, argbuf, argbuflength); // grab waitLoop stub GSPGPU_FlushDataCache(NULL, (u8*)&gspHeap[0x00200000], 0x100); doGspwn((u32*)(MENU_LOADEDROP_BUFADR-0x100), (u32*)&gspHeap[0x00200000], 0x100); svc_sleepThread(20*1000*1000); // patch it u32* patchArea = (u32*)&gspHeap[0x00200000]; for(int i=0; i<0x100/4; i++) { if(patchArea[i] == 0xBABEBAD0) { patchArea[i-1] = patchArea[i+1]; break; } } // copy it back GSPGPU_FlushDataCache(NULL, (u8*)&gspHeap[0x00200000], 0x100); doGspwn((u32*)&gspHeap[0x00200000], (u32*)(MENU_LOADEDROP_BUFADR-0x100), 0x100); svc_sleepThread(20*1000*1000); // ghetto dcache invalidation // don't judge me int i, j;//, k; // for(k=0; k<0x2; k++) for(j=0; j<0x4; j++) for(i=0; i<0x01000000/0x4; i+=0x4) ((u32*)gspHeap)[i+j]^=0xDEADBABE; //exit to menu // _aptExit(); exitSrv(); // do that at the end so that release right is one of the last things to happen { GSPGPU_UnregisterInterruptRelayQueue(NULL); //unmap GSP shared mem svc_unmapMemoryBlock(gspSharedMemHandle, 0x10002000); svc_closeHandle(gspSharedMemHandle); svc_closeHandle(gspEvent); //free GSP heap svc_controlMemory((u32*)&gspHeap, (u32)gspHeap, 0x0, 0x01000000, MEMOP_FREE, 0x0); Handle _gspGpuHandle = gspGpuHandle; // free heap (has to be the very last thing before jumping to app as contains bss) u32 out; svc_controlMemory(&out, (u32)_heap_base, 0x0, _heap_size, MEMOP_FREE, 0x0); GSPGPU_ReleaseRight(&_gspGpuHandle); svc_closeHandle(_gspGpuHandle); } svc_exitProcess(); }