WiiFlow_Lite/source/loader/wip.c

75 lines
1.5 KiB
C
Raw Normal View History

2012-01-21 21:57:41 +01:00
#include <gccore.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "wip.h"
#include "gecko/gecko.h"
#include "memory/mem2.hpp"
2012-01-21 21:57:41 +01:00
static WIP_Code *CodeList = NULL;
2012-01-21 21:57:41 +01:00
static u32 CodesCount = 0;
u32 get_wip_count()
2012-01-21 21:57:41 +01:00
{
return CodesCount;
2012-01-21 21:57:41 +01:00
}
WIP_Code *get_wip_list()
2012-01-21 21:57:41 +01:00
{
return CodeList;
2012-01-21 21:57:41 +01:00
}
int load_wip_patches(u8 *dir, u8 *gameid)
{
char filepath[150];
char GameID[7];
GameID[6] = '\0';
memcpy(GameID, gameid, 6);
2012-01-21 21:57:41 +01:00
snprintf(filepath, sizeof(filepath), "%s/%s.wip", dir, GameID);
FILE *fp = fopen(filepath, "rb");
if(!fp)
2012-01-21 21:57:41 +01:00
{
memcpy(GameID, gameid, 3);
GameID[3] = '\0';
2012-01-21 21:57:41 +01:00
snprintf(filepath, sizeof(filepath), "%s/%s.wip", dir, GameID);
fp = fopen(filepath, "rb");
}
if(!fp)
return -1;
2012-01-21 21:57:41 +01:00
char line[255];
gprintf("\nLoading WIP code from %s.\n", filepath);
2012-01-21 21:57:41 +01:00
while(fgets(line, sizeof(line), fp))
{
if(line[0] == '#' || strlen(line) < 26)
continue;
2012-01-21 21:57:41 +01:00
u32 offset = (u32) strtoul(line, NULL, 16);
u32 srcaddress = (u32) strtoul(line+9, NULL, 16);
u32 dstaddress = (u32) strtoul(line+18, NULL, 16);
2012-01-21 21:57:41 +01:00
if(!CodeList)
CodeList = MEM2_alloc(sizeof(WIP_Code));
2012-01-21 21:57:41 +01:00
WIP_Code *tmp = MEM2_realloc(CodeList, (CodesCount+1)*sizeof(WIP_Code));
if(!tmp)
{
free(CodeList);
fclose(fp);
return -1;
}
CodeList = tmp;
CodeList[CodesCount].offset = offset;
CodeList[CodesCount].srcaddress = srcaddress;
CodeList[CodesCount].dstaddress = dstaddress;
CodesCount++;
}
fclose(fp);
2012-01-21 21:57:41 +01:00
return 0;
}