-made possible elf path much longer, instead of 80 characters it now supports up to 250

-if a elf requests to return to hbl it will now also return to hbl instead of always forcing it out to mii maker, fixes apps like wupinstaller
This commit is contained in:
FIX94 2016-11-14 20:07:50 +01:00
parent e803047295
commit eedfba866c
5 changed files with 26 additions and 53 deletions

View File

@ -29,6 +29,9 @@ extern "C" {
#define MEM_AREA_TABLE ((s_mem_area*)(MEM_BASE + 0x1600))
#define SD_LOADER_PATH ((char*)(MEM_BASE + 0x1E00))
#define SD_LOADER_FORCE_HBL (*(volatile unsigned int*)(MEM_BASE + 0x1E00 + 0xFC))
#ifndef EXIT_SUCCESS
#define EXIT_SUCCESS 0
#endif

View File

@ -305,16 +305,6 @@ static void InstallMain(private_data_t *private_data)
if(section_offset > 0)
SC_0x25_KernelCopyData((void*)(CODE_RW_BASE_OFFSET + main_text_addr), main_text, main_text_len);
// get the .rodata1 section
unsigned int main_rodata1_addr = 0;
unsigned int main_rodata1_len = 0;
section_offset = get_section(private_data, private_data->data_elf, ".rodata1", &main_rodata1_len, &main_rodata1_addr, 0);
if(section_offset > 0)
{
/* Copy main rodata to memory */
SC_0x25_KernelCopyData((void*)(DATA_RW_BASE_OFFSET + main_rodata1_addr), (void*)0xF5E70000, main_rodata1_len);
}
// get the .rodata section
unsigned int main_rodata_addr = 0;
unsigned int main_rodata_len = 0;
@ -367,6 +357,9 @@ static void InstallPatches(private_data_t *private_data)
SC_0x25_KernelCopyData((void*)&ELF_DATA_ADDR, &bufferU32, sizeof(bufferU32));
bufferU32 = 0;
SC_0x25_KernelCopyData((void*)&ELF_DATA_SIZE, &bufferU32, sizeof(bufferU32));
/* Related to sd-loader elf choice */
SC_0x25_KernelCopyData((void*)SD_LOADER_PATH, (void*)0xF5E70000, 250);
SC_0x25_KernelCopyData((void*)&SD_LOADER_FORCE_HBL, &bufferU32, sizeof(bufferU32));
unsigned int jump_main_hook = 0;
osSpecificFunctions.addr_OSDynLoad_Acquire = (unsigned int)OSDynLoad_Acquire;

View File

@ -564,17 +564,10 @@ static void loadFunctionPointers(private_data_t * private_data)
OS_FIND_EXPORT(sysapp_handle, "SYSRelaunchTitle", private_data->SYSRelaunchTitle);
}
extern const char PROVIDED_ELF_LAUNCH_PATH;
extern int INT_EXIT_TO_MENU;
static const char *HBL_ELF_PATH = "/vol/external01/wiiu/apps/homebrew_launcher/homebrew_launcher.elf";
unsigned int _main(int argc, char **argv)
{
unsigned int entry = *(unsigned int*)OS_SPECIFICS->addr_OSTitle_main_entry;
//! force launch normal title every time (safety lock-out mechanism)
if(INT_EXIT_TO_MENU == 2)
return entry;
private_data_t private_data;
if(MAIN_ENTRY_ADDR != 0xC001C0DE)
@ -609,7 +602,7 @@ unsigned int _main(int argc, char **argv)
unsigned char *pElfBuffer = NULL;
unsigned int uiElfSize = 0;
LoadFileToMem(&private_data, &PROVIDED_ELF_LAUNCH_PATH, &pElfBuffer, &uiElfSize);
LoadFileToMem(&private_data, SD_LOADER_FORCE_HBL ? HBL_ELF_PATH : SD_LOADER_PATH, &pElfBuffer, &uiElfSize);
if(!pElfBuffer)
{
@ -632,19 +625,15 @@ unsigned int _main(int argc, char **argv)
else
{
int returnVal = ((int (*)(int, char **))MAIN_ENTRY_ADDR)(argc, argv);
//! launched custom elf once, now activate lock-out mechanism for safety
if(INT_EXIT_TO_MENU == 1)
INT_EXIT_TO_MENU = 2;
//! exit to miimaker and restart application on re-enter of another application
if(returnVal == (int)EXIT_RELAUNCH_ON_LOAD)
{
//! exited hbl itself, activate lock-out mechanism for safety
INT_EXIT_TO_MENU = 2;
break;
}
//! exit to homebrew launcher in all other cases
else
{
SD_LOADER_FORCE_HBL = 1;
MAIN_ENTRY_ADDR = 0xDEADC0DE;
private_data.SYSRelaunchTitle(0, 0);
private_data.exit(0);
@ -654,13 +643,14 @@ unsigned int _main(int argc, char **argv)
}
}
unsigned int entry = *(unsigned int*)OS_SPECIFICS->addr_OSTitle_main_entry;
//! if an application was an RPX launch then launch HBL again after return
if(MAIN_ENTRY_ADDR == 0xC001C0DE)
/*if(MAIN_ENTRY_ADDR == 0xC001C0DE)
{
int ret = ( (int (*)(int, char **))(entry) )(argc, argv);
private_data.SYSRelaunchTitle(0, 0);
private_data.exit(ret);
}
}*/
//! launch the original title with clean stack
return entry;
}

View File

@ -11,16 +11,13 @@ SECTIONS {
KEEP(*(.kernel_code*));
}
.data : {
*(.rodata) *(.rodata.*);
*(.rodata*);
*(.data*);
*(.bss*);
}
.rodata1 : {
*(.rodata1) *(.rodata1.*)
}
/DISCARD/ : {
*(*);
}
}
ASSERT((SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.rodata1)) <= 0x1300, "Memory overlapping with main elf.");
ASSERT((SIZEOF(.text) + SIZEOF(.data)) <= 0x1300, "Memory overlapping with main elf.");

View File

@ -105,18 +105,13 @@ uint32_t __main(void)
void*(*MEMAllocFromDefaultHeap)(int size) = (void*)(*pMEMAllocFromDefaultHeap);
void(*MEMFreeToDefaultHeap)(void *ptr) = (void*)(*pMEMFreeToDefaultHeap);
void* (*OSAllocFromSystem)(uint32_t size, int align);
void (*OSFreeToSystem)(void *ptr);
OSDynLoad_FindExport(coreinit_handle, 0, "OSAllocFromSystem", &OSAllocFromSystem);
OSDynLoad_FindExport(coreinit_handle, 0, "OSFreeToSystem", &OSFreeToSystem);
int hbl = 1;
//default path goes to HBL
strcpy((void*)0xF5E70000,"/vol/external01/wiiu/apps/homebrew_launcher/homebrew_launcher.elf");
int iFd = -1;
void *pClient = OSAllocFromSystem(0x1700,4);
void *pCmd = OSAllocFromSystem(0xA80,4);
void *pClient = MEMAllocFromDefaultHeapEx(0x1700,4);
void *pCmd = MEMAllocFromDefaultHeapEx(0xA80,4);
void *pBuffer = NULL;
void (*DCStoreRange)(void *buffer, uint32_t length);
@ -153,7 +148,7 @@ uint32_t __main(void)
if(stat.size > 0)
{
pBuffer = OSAllocFromSystem(stat.size+1,0x40);
pBuffer = MEMAllocFromDefaultHeapEx(stat.size+1,0x40);
memset(pBuffer,0,stat.size+1);
}
else
@ -219,24 +214,24 @@ uint32_t __main(void)
if(FnameChar[0] == '/' && fLen > 7 && *(FnameChar+fLen-7) == '/')
{
*(FnameChar+fLen-7) = '\0';
__os_snprintf((void*)0xF5E70000,160,"/vol/sdcard%s",FnameChar);
__os_snprintf((void*)0xF5E70000,32,"/vol/sdcard%s",FnameChar);
}
else if(FnameChar[0] != '/' && fLen > 6 && *(FnameChar+fLen-7) == '/')
{
*(FnameChar+fLen-7) = '\0';
__os_snprintf((void*)0xF5E70000,160,"/vol/sdcard/%s",FnameChar);
__os_snprintf((void*)0xF5E70000,32,"/vol/sdcard/%s",FnameChar);
}
else
__os_snprintf((void*)0xF5E70000,160,"/vol/sdcard");
__os_snprintf((void*)0xF5E70000,32,"/vol/sdcard");
hbl = 0;
break;
}
else if(memcmp(FnameChar+fLen-4,".elf",5) == 0)
{
if(FnameChar[0] == '/')
__os_snprintf((void*)0xF5E70000,80,"/vol/external01%s",FnameChar);
__os_snprintf((void*)0xF5E70000,250,"/vol/external01%s",FnameChar);
else
__os_snprintf((void*)0xF5E70000,80,"/vol/external01/%s",FnameChar);
__os_snprintf((void*)0xF5E70000,250,"/vol/external01/%s",FnameChar);
break;
}
}
@ -249,18 +244,13 @@ fileEnd:
if(iFd >= 0)
FSCloseFile(pClient, pCmd, iFd, -1);
FSDelClient(pClient);
OSFreeToSystem(pClient);
OSFreeToSystem(pCmd);
MEMFreeToDefaultHeap(pClient);
MEMFreeToDefaultHeap(pCmd);
}
if(pBuffer)
OSFreeToSystem(pBuffer);
MEMFreeToDefaultHeap(pBuffer);
if(hbl)
{
if(strstr((char*)0xF5E70000, "/homebrew_launcher.elf") != NULL)
*(int*)0xF5E70050 = 0; //return to hbl
else
*(int*)0xF5E70050 = 1; //return to menu
}
*(int*)0xF5E700FC = 0; //set SD_LOADER_FORCE_HBL to 0
DCStoreRange((void*)0xF5E70000,0xA0);
uint32_t entry = (hbl ? 0x01800000 : 0x0180C000);
return entry;