void __preinit_user(MEMHeapHandle *mem1, MEMHeapHandle *foreground, MEMHeapHandle *mem2) { uint32_t addr, size; MEMAllocFromDefaultHeap = CustomAllocFromDefaultHeap; MEMAllocFromDefaultHeapEx = CustomAllocFromDefaultHeapEx; MEMFreeToDefaultHeap = CustomFreeToDefaultHeap; if (OSGetForegroundBucket(NULL, NULL)) { OSGetMemBound(OS_MEM1, &addr, &size); *mem1 = MEMCreateFrmHeapEx((void *)addr, size, 0); OSGetForegroundBucketFreeArea(&addr, &size); *foreground = MEMCreateFrmHeapEx((void *)addr, size, 0); } OSGetMemBound(OS_MEM2, &addr, &size); sCustomHeap = MEMCreateExpHeapEx((void *)addr, size, MEM_HEAP_FLAG_USE_LOCK); sCustomHeapAddr = addr; sCustomHeapSize = size; *mem2 = sCustomHeap; OSDynLoad_SetAllocator(CustomDynLoadAlloc, CustomDynLoadFree); OSDynLoad_SetTLSAllocator(CustomDynLoadAlloc, CustomDynLoadFree); }
static MemoryList * findListContainingHeap(CommonHeap *heap) { be_val<uint32_t> start, size, end; OSGetForegroundBucket(&start, &size); end = start + size; if (heap->dataStart >= start && heap->dataEnd < end) { return gForegroundMemlist; } else { OSGetMemBound(OSMemoryType::MEM1, &start, &size); end = start + size; if (heap->dataStart >= start && heap->dataEnd < end) { return gMEM1Memlist; } else { return gMEM2Memlist; } } }
static MemoryList * findListContainingBlock(void *block) { be_val<uint32_t> start, size, end; uint32_t addr = gMemory.untranslate(block); OSGetForegroundBucket(&start, &size); end = start + size; if (addr >= start && addr < end) { return gForegroundMemlist; } else { OSGetMemBound(OSMemoryType::MEM1, &start, &size); end = start + size; if (addr >= start && addr < end) { return gMEM1Memlist; } else { return gMEM2Memlist; } } }