1
0
Fork 0

Fixed allocation error

This commit is contained in:
JoshuaMKW 2020-06-03 21:45:15 -05:00
parent a02e6c55c8
commit b8d8ea14bc

View file

@ -43,24 +43,26 @@ struct Info {
};
struct DiscInfo {
const u8 mDiscID;
const u16 mGameCode;
const u8 mRegionCode;
const u16 mMakerCode;
const u8 mDiscNumber;
const u8 mDiscVersion;
const u8 mAudioStreaming;
const u8 mStreamBufferSize;
const u8 _00[12];
const u32 mWiiMagic;
const u32 mGCNMagic;
const u32 _01[2];
u32 mRAMSize;
const u32 _02[2];
u32* mHeapPointer;
u32 mHeapMirror;
u32 mFstSize;
u32 mData[0x30D0 / 4];
const u8 mDiscID; //0x0000
const u16 mGameCode; //0x0001
const u8 mRegionCode; //0x0003
const u16 mMakerCode; //0x0004
const u8 mDiscNumber; //0x0006
const u8 mDiscVersion; //0x0007
const u8 mAudioStreaming; //0x0008
const u8 mStreamBufferSize; //0x0009
const u8 _00[12]; //0x000A
const u32 mWiiMagic; //0x0018
const u32 mGCNMagic; //0x001C
const u32 _01[2]; //0x0020
u32 mRAMSize; //0x0028
const u32 _02[2]; //0x002C
u32* mOSArenaHi; //0x0034
u32* mFstPointer; //0x0038
u32 mFstSize; //0x003C
u32 _03[0xB4 / 4]; //0x0040
u32* mTranslation; //0x00F4
u32 _04[0x3018 / 4];
u32 mWiiHeap;
};
@ -157,12 +159,22 @@ static inline void hookFunction(u32* start, u32 hookInstruction, u32 hookTo, boo
the game is for, to make space for our codes*/
static inline void setHeap(u32 alloc)
{
if (gpDiscResources->mWiiMagic) {
gpDiscResources->mHeapPointer = (u32*)((u32)gpDiscResources->mWiiHeap - alloc);
gpDiscResources->mWiiHeap = (u32)gpDiscResources->mHeapPointer;
if (gpDiscResources->mTranslation < gpDiscResources->mOSArenaHi) {
if (gpDiscResources->mWiiMagic) {
gpDiscResources->mTranslation = (u32*)((u32)gpDiscResources->mTranslation - alloc);
gpDiscResources->mWiiHeap = (u32)gpDiscResources->mTranslation;
} else {
gpDiscResources->mTranslation = (u32*)((u32)gpDiscResources->mTranslation - alloc);
}
} else {
gpDiscResources->mHeapPointer = (u32*)((u32)gpDiscResources->mHeapPointer - alloc);
if (gpDiscResources->mWiiMagic) {
gpDiscResources->mOSArenaHi = (u32*)((u32)gpDiscResources->mWiiHeap - alloc);
gpDiscResources->mWiiHeap = (u32)gpDiscResources->mOSArenaHi;
} else {
gpDiscResources->mOSArenaHi = (u32*)((u32)gpDiscResources->mOSArenaHi - alloc);
}
}
}
static inline void memCopy(u32* to, u32* from, s32 size)
@ -189,11 +201,11 @@ static inline bool initMods(DiscInfo* gpDiscResources)
/*Change codelist pointer to the new address in the allocation*/
CodeList* codelistPointer = (CodeList*)((u32)&gpModInfo + sizeof(gpModInfo) + 0xFC);
codelistPointer->mUpperBase = (((u32)gpDiscResources->mHeapPointer + gpModInfo.handlerSize) >> 16) & 0xFFFF;
codelistPointer->mLowerOffset = ((u32)gpDiscResources->mHeapPointer + gpModInfo.handlerSize) & 0xFFFF;
codelistPointer->mUpperBase = (((u32)gpDiscResources->mOSArenaHi + gpModInfo.handlerSize) >> 16) & 0xFFFF;
codelistPointer->mLowerOffset = ((u32)gpDiscResources->mOSArenaHi + gpModInfo.handlerSize) & 0xFFFF;
/*Copy codelist to the new allocation*/
memCopy(gpDiscResources->mHeapPointer, (u32*)((u32)&gpModInfo + sizeof(gpModInfo) + 4), (gpModInfo.handlerSize + gpModInfo.codeSize) >> 2);
memCopy(gpDiscResources->mOSArenaHi, (u32*)((u32)&gpModInfo + sizeof(gpModInfo) + 4), (gpModInfo.handlerSize + gpModInfo.codeSize) >> 2);
/*Update the cache, so that the instructions fully update*/
flushAddr(&codelistPointer->mBaseASM);
@ -203,19 +215,19 @@ static inline bool initMods(DiscInfo* gpDiscResources)
if (functionAddr == nullptr)
return false;
hookFunction(functionAddr, 0x4E800020, (u32)gpDiscResources->mHeapPointer + 0xA8, false);
hookFunction(functionAddr, 0x4E800020, (u32)gpDiscResources->mOSArenaHi + 0xA8, false);
} else {
directBranchEx((void*)gpModInfo.codehandlerHook, (void*)((u32)gpDiscResources->mHeapPointer + 0xA8), false);
directBranchEx((void*)gpModInfo.codehandlerHook, (void*)((u32)gpDiscResources->mOSArenaHi + 0xA8), false);
}
flushCacheRange((u8*)gpDiscResources->mHeapPointer, gpModInfo.handlerSize + gpModInfo.codeSize);
flushCacheRange((u8*)gpDiscResources->mOSArenaHi, gpModInfo.handlerSize + gpModInfo.codeSize);
return true;
}
int main()
{
if ((gpDiscResources->mWiiMagic || gpDiscResources->mGCNMagic) && initMods(gpDiscResources) == true)
call((void*)((u32)(gpDiscResources->mHeapPointer) + 0xA8))(); /*Call the codehandler if successful*/
call((void*)((u32)(gpDiscResources->mOSArenaHi) + 0xA8))(); /*Call the codehandler if successful*/
call(0xDEADBEEF)(); /*Call the game start*/
}