From 5fbe504f203305d05e31b769fb08752f78dd39f8 Mon Sep 17 00:00:00 2001 From: Rohul1997 Date: Sun, 28 Feb 2016 19:08:38 +0000 Subject: [PATCH] Added files --- Makefile | 191 +++++++++++++ README.md | 14 + Resources/hblauncher_loader.cwav | Bin 0 -> 57560 bytes Resources/hblauncher_loader.rsf | 171 ++++++++++++ banner.png | Bin 0 -> 149928 bytes icon.png | Bin 0 -> 21865 bytes source/hblauncher_loader.c | 461 +++++++++++++++++++++++++++++++ source/start.s | 100 +++++++ 8 files changed, 937 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 Resources/hblauncher_loader.cwav create mode 100644 Resources/hblauncher_loader.rsf create mode 100644 banner.png create mode 100644 icon.png create mode 100644 source/hblauncher_loader.c create mode 100644 source/start.s diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ca89022 --- /dev/null +++ b/Makefile @@ -0,0 +1,191 @@ +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- + +ifeq ($(strip $(DEVKITARM)),) +$(error "Please set DEVKITARM in your environment. export DEVKITARM=devkitARM") +endif + +TOPDIR ?= $(CURDIR) +include $(DEVKITARM)/3ds_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# DATA is a list of directories containing data files +# INCLUDES is a list of directories containing header files +# +# NO_SMDH: if set to anything, no SMDH file is generated. +# APP_TITLE is the name of the app stored in the SMDH file (Optional) +# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional) +# APP_AUTHOR is the author of the app stored in the SMDH file (Optional) +# ICON is the filename of the icon (.png), relative to the project folder. +# If not set, it attempts to use one of the following (in this order): +# - .png +# - icon.png +# - /default_icon.png +#--------------------------------------------------------------------------------- +TARGET := $(notdir $(CURDIR)) +BUILD := build +SOURCES := source +DATA := data +INCLUDES := include + +VERSION := v1.1 + +APP_TITLE := hblauncher_loader $(VERSION) +APP_DESCRIPTION := This boots the hblauncher-payload. +APP_AUTHOR := yellows8 + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- +ARCH := -march=armv6k -mtune=mpcore -mfloat-abi=hard + +CFLAGS := -g -Wall -O2 -mword-relocations \ + -fomit-frame-pointer -ffast-math \ + $(ARCH) + +CFLAGS += $(INCLUDE) -DARM11 -D_3DS -DVERSION=\"$(VERSION)\" + +CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11 + +ASFLAGS := -g $(ARCH) +LDFLAGS = -nostartfiles -T$(DEVKITARM)/arm-none-eabi/lib/3dsx.ld -g $(ARCH) -Wl,-Map,$(notdir $*.map) + +LIBS := -lctru -lm + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CTRULIB) + + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) +export TOPDIR := $(CURDIR) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) +#--------------------------------------------------------------------------------- + export LD := $(CC) +#--------------------------------------------------------------------------------- +else +#--------------------------------------------------------------------------------- + export LD := $(CXX) +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o) + +export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) + +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) + +ifeq ($(strip $(ICON)),) + icons := $(wildcard *.png) + ifneq (,$(findstring $(TARGET).png,$(icons))) + export APP_ICON := $(TOPDIR)/$(TARGET).png + else + ifneq (,$(findstring icon.png,$(icons))) + export APP_ICON := $(TOPDIR)/icon.png + endif + endif +else + export APP_ICON := $(TOPDIR)/$(ICON) +endif + +ifeq ($(strip $(NO_SMDH)),) + export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh +endif + +.PHONY: $(BUILD) clean all + +#--------------------------------------------------------------------------------- +all: $(BUILD) + +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(TARGET).3dsx $(OUTPUT).smdh $(TARGET).elf $(OUTPUT).cia Resources/hblauncher_loader.icn Resources/hblauncher_loader.bnr + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +ifeq ($(strip $(NO_SMDH)),) +$(OUTPUT).3dsx : $(OUTPUT).elf $(OUTPUT).smdh $(OUTPUT).cia +else +$(OUTPUT).3dsx : $(OUTPUT).elf +endif + +$(OUTPUT).elf : $(OFILES) + +../Resources/hblauncher_loader.icn : $(APP_ICON) + @bannertool makesmdh -i "$(APP_ICON)" -o "$@" -s "$(APP_TITLE)" -l "$(APP_TITLE)" -p "$(APP_AUTHOR)" + +../Resources/hblauncher_loader.bnr : ../banner.png + @bannertool makebanner -i "$<" -ca ../Resources/hblauncher_loader.cwav -o "$@" + +$(OUTPUT).cia : $(OUTPUT).elf ../Resources/hblauncher_loader.icn ../Resources/hblauncher_loader.bnr + @makerom -f cia -o "$@" -elf $(OUTPUT).elf -rsf ../Resources/hblauncher_loader.rsf -icon ../Resources/hblauncher_loader.icn -banner ../Resources/hblauncher_loader.bnr -exefslogo -ver 1040 + @echo "built ... hblauncher_loader.cia" + +#--------------------------------------------------------------------------------- +# you need a rule like this for each extension you use as binary data +#--------------------------------------------------------------------------------- +%.bin.o : %.bin +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @$(bin2o) + +# WARNING: This is not the right way to do this! TODO: Do it right! +#--------------------------------------------------------------------------------- +%.vsh.o : %.vsh +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + @python $(AEMSTRO)/aemstro_as.py $< ../$(notdir $<).shbin + @bin2s ../$(notdir $<).shbin | $(PREFIX)as -o $@ + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u8" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(notdir $<).shbin | tr . _)`.h + @echo "extern const u32" `(echo $(notdir $<).shbin | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(notdir $<).shbin | tr . _)`.h + @rm ../$(notdir $<).shbin + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------------- diff --git a/README.md b/README.md new file mode 100644 index 0000000..84d456a --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +This is a 3DS homebrew application intended for running under a NCCH(which can be installed via .cia), for booting the *hax payloads. https://smealum.github.io/3ds/ + +This app was mostly finished in October 2015, this was finally released on November 25, 2015, due to the custom logo being finished. + +This will first attempt to load the payload from SD, if that isn't successful it will then automatically download the payload for your system with HTTP. SD payload loading can be skipped if you hold down the X button. If you don't hold down the Y button, this will write the downloaded payload from HTTP to SD, if it actually downloaded it via HTTP. + +The exact filepath used for the SD payload depends on your system. Since this app can handle writing the payload here itself, writing the payload here manually isn't really needed. Example SD filepath with New3DS 10.1.0-27U: "/hblauncherloader_otherapp_payload_NEW-10-1-0-27-USA.bin". The Old3DS filepath for the same system-version and region as that example is the same, except that "OLD" is used instead of "NEW". + +If you want to manually build this, you'll need this: https://github.com/Steveice10/bannertool + +Credits: +* 3DSGuy for originally converting the CWAV used by this app's banner, years ago(which seems to be originally from the Wii HBC banner audio?). +* @Substance12 For the icon/banner(#4). + diff --git a/Resources/hblauncher_loader.cwav b/Resources/hblauncher_loader.cwav new file mode 100644 index 0000000000000000000000000000000000000000..fd185d208000b630331e07146296d7ce2bdbf5c6 GIT binary patch literal 57560 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: + SystemCallAccess: + ArbitrateAddress: 34 + Break: 60 + CancelTimer: 28 + ClearEvent: 25 + ClearTimer: 29 + CloseHandle: 35 + ConnectToPort: 45 + ControlMemory: 1 + CreateAddressArbiter: 33 + CreateEvent: 23 + CreateMemoryBlock: 30 + CreateMutex: 19 + CreateSemaphore: 21 + CreateThread: 8 + CreateTimer: 26 + DuplicateHandle: 39 + ExitProcess: 3 + ExitThread: 9 + GetCurrentProcessorNumber: 17 + GetHandleInfo: 41 + GetProcessId: 53 + GetProcessIdOfThread: 54 + GetProcessIdealProcessor: 6 + GetProcessInfo: 43 + GetResourceLimit: 56 + GetResourceLimitCurrentValues: 58 + GetResourceLimitLimitValues: 57 + GetSystemInfo: 42 + GetSystemTick: 40 + GetThreadContext: 59 + GetThreadId: 55 + GetThreadIdealProcessor: 15 + GetThreadInfo: 44 + GetThreadPriority: 11 + MapMemoryBlock: 31 + OutputDebugString: 61 + QueryMemory: 2 + ReleaseMutex: 20 + ReleaseSemaphore: 22 + SendSyncRequest1: 46 + SendSyncRequest2: 47 + SendSyncRequest3: 48 + SendSyncRequest4: 49 + SendSyncRequest: 50 + SetThreadPriority: 12 + SetTimer: 27 + SignalEvent: 24 + SleepThread: 10 + UnmapMemoryBlock: 32 + WaitSynchronization1: 36 + WaitSynchronizationN: 37 + FlushProcessDataCache: 84 + ControlProcessMemory: 112 + + # Service List + # Maximum 34 services (32 if firmware is prior to 9.6.0) + ServiceAccessControl: + - APT:U + - cfg:u + - fs:USER + - gsp::Gpu + - hid:USER + - http:C + + +SystemControlInfo: + SaveDataSize: 0K + RemasterVersion: 0 + StackSize: 0x8000 + + # Modules that run services listed above should be included below + # Maximum 48 dependencies + # If a module is listed that isn't present on the 3DS, the title will get stuck at the logo (3ds waves) + # So act, nfc and qtm are commented for 4.x support. Uncomment if you need these. + # : + Dependency: + cfg: 0x0004013000001702L + gsp: 0x0004013000001c02L + hid: 0x0004013000001d02L + http: 0x0004013000002902L diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..030af98803753c92cd54dd4cd808008563e9eba1 GIT binary patch literal 149928 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 BJ5vAv literal 0 HcmV?d00001 diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..70bb483ddbab58338c33b372eb7f9de13f775a07 GIT binary patch literal 21865 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 Y{S%Gt?=NU(L#?ZBS^3mWcYOW-0CHgZ-v9sr literal 0 HcmV?d00001 diff --git a/source/hblauncher_loader.c b/source/hblauncher_loader.c new file mode 100644 index 0000000..838c11d --- /dev/null +++ b/source/hblauncher_loader.c @@ -0,0 +1,461 @@ +#include +#include +#include +#include +#include +#include +#include <3ds.h> + +extern u32 PAYLOAD_TEXTADDR[]; +extern u32 PAYLOAD_TEXTMAXSIZE; + +extern Handle gspGpuHandle; + +u8 *filebuffer; +u32 filebuffer_maxsize; + +char regionids_table[7][4] = {//http://3dbrew.org/wiki/Nandrw/sys/SecureInfo_A +"JPN", +"USA", +"EUR", +"JPN", //"AUS" +"CHN", +"KOR", +"TWN" +}; + +void gxlowcmd_4(u32* inadr, u32* outadr, u32 size, u32 width0, u32 height0, u32 width1, u32 height1, u32 flags) +{ + GX_TextureCopy(inadr, width0 | (height0<<16), outadr, width1 | (height1<<16), size, flags); +} + +Result gsp_flushdcache(u8* adr, u32 size) +{ + return GSPGPU_FlushDataCache(adr, size); +} + +Result http_getactual_payloadurl(char *requrl, char *outurl, u32 outurl_maxsize) +{ + Result ret=0; + httpcContext context; + + ret = httpcOpenContext(&context, HTTPC_METHOD_GET, requrl, 1); + if(ret!=0)return ret; + + ret = httpcAddRequestHeaderField(&context, "User-Agent", "hblauncher_loader/"VERSION); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + ret = httpcBeginRequest(&context); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + ret = httpcGetResponseHeader(&context, "Location", outurl, outurl_maxsize); + + httpcCloseContext(&context); + + return 0; +} + +Result http_download_payload(char *url, u32 *payloadsize) +{ + Result ret=0; + u32 statuscode=0; + u32 contentsize=0; + httpcContext context; + + ret = httpcOpenContext(&context, HTTPC_METHOD_GET, url, 1); + if(ret!=0)return ret; + + ret = httpcAddRequestHeaderField(&context, "User-Agent", "hblauncher_loader/"VERSION); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + ret = httpcBeginRequest(&context); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + ret = httpcGetResponseStatusCode(&context, &statuscode, 0); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + if(statuscode!=200) + { + printf("Error: server returned HTTP statuscode %u.\n", (unsigned int)statuscode); + httpcCloseContext(&context); + return -2; + } + + ret=httpcGetDownloadSizeState(&context, NULL, &contentsize); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + if(contentsize==0 || contentsize>PAYLOAD_TEXTMAXSIZE) + { + printf("Invalid HTTP content-size: 0x%08x.\n", (unsigned int)contentsize); + ret = -3; + httpcCloseContext(&context); + return ret; + } + + ret = httpcDownloadData(&context, filebuffer, contentsize, NULL); + if(ret!=0) + { + httpcCloseContext(&context); + return ret; + } + + httpcCloseContext(&context); + + *payloadsize = contentsize; + + return 0; +} + +Result loadsd_payload(char *filepath, u32 *payloadsize) +{ + struct stat filestats; + FILE *f; + size_t readsize=0; + + if(stat(filepath, &filestats)==-1)return errno; + + *payloadsize = filestats.st_size; + + if(filestats.st_size==0 || filestats.st_size>PAYLOAD_TEXTMAXSIZE) + { + printf("Invalid SD payload size: 0x%08x.\n", (unsigned int)filestats.st_size); + return -3; + } + + f = fopen(filepath, "r"); + if(f==NULL)return errno; + + readsize = fread(filebuffer, 1, filestats.st_size, f); + fclose(f); + + if(readsize!=filestats.st_size) + { + printf("fread() failed with the SD payload.\n"); + return -2; + } + + return 0; +} + +Result savesd_payload(char *filepath, u32 payloadsize) +{ + FILE *f; + size_t writesize=0; + + unlink(filepath); + + f = fopen(filepath, "w+"); + if(f==NULL) + { + printf("Failed to open the SD payload for writing.\n"); + return errno; + } + + writesize = fwrite(filebuffer, 1, payloadsize, f); + fclose(f); + + if(writesize!=payloadsize) + { + printf("fwrite() failed with the SD payload.\n"); + return -2; + } + + return 0; +} + +Result load_hblauncher() +{ + Result ret = 0; + u8 region=0; + u8 new3dsflag = 0; + + OS_VersionBin nver_versionbin; + OS_VersionBin cver_versionbin; + + u32 payloadsize = 0, payloadsize_aligned = 0; + u32 payload_src = 0; + + char payload_sysver[32]; + char payloadurl[0x80]; + char payload_sdpath[0x80]; + + void (*funcptr)(u32*, u32*) = NULL; + u32 *paramblk = NULL; + + memset(&nver_versionbin, 0, sizeof(OS_VersionBin)); + memset(&cver_versionbin, 0, sizeof(OS_VersionBin)); + + memset(payload_sysver, 0, sizeof(payload_sysver)); + memset(payloadurl, 0, sizeof(payloadurl)); + memset(payload_sdpath, 0, sizeof(payload_sdpath)); + + printf("Getting system-version/system-info etc...\n"); + + ret = cfguInit(); + if(ret!=0) + { + printf("Failed to init cfgu: 0x%08x.\n", (unsigned int)ret); + return ret; + } + ret = CFGU_SecureInfoGetRegion(®ion); + if(ret!=0) + { + printf("Failed to get region from cfgu: 0x%08x.\n", (unsigned int)ret); + return ret; + } + if(region>=7) + { + printf("Region value from cfgu is invalid: 0x%02x.\n", (unsigned int)region); + ret = -9; + return ret; + } + cfguExit(); + + APT_CheckNew3DS(&new3dsflag); + + ret = osGetSystemVersionData(&nver_versionbin, &cver_versionbin); + if(ret!=0) + { + printf("Failed to load the system-version: 0x%08x.\n", (unsigned int)ret); + return ret; + } + + snprintf(payload_sysver, sizeof(payload_sysver)-1, "%s-%d-%d-%d-%d-%s", new3dsflag?"NEW":"OLD", cver_versionbin.mainver, cver_versionbin.minor, cver_versionbin.build, nver_versionbin.mainver, regionids_table[region]); + snprintf(payloadurl, sizeof(payloadurl)-1, "http://smea.mtheall.com/get_payload.php?version=%s", payload_sysver); + snprintf(payload_sdpath, sizeof(payload_sdpath)-1, "sdmc:/hblauncherloader_otherapp_payload_%s.bin", payload_sysver); + + printf("Detected system-version: %s %d.%d.%d-%d %s\n", new3dsflag?"New3DS":"Old3DS", cver_versionbin.mainver, cver_versionbin.minor, cver_versionbin.build, nver_versionbin.mainver, regionids_table[region]); + + memset(filebuffer, 0, filebuffer_maxsize); + + hidScanInput(); + + if((hidKeysHeld() & KEY_X) == 0) + { + printf("Since the X button isn't pressed, this will now check for the otherapp payload on SD, with the following filepath: %s\n", payload_sdpath); + ret = loadsd_payload(payload_sdpath, &payloadsize); + } + else + { + printf("Skipping SD payload load-attempt since the X button is pressed.\n"); + ret = 1; + } + + if(ret==0) + { + printf("The otherapp payload for this app already exists on SD, that will be used instead of downloading the payload via HTTP.\n"); + payload_src = 0; + } + else + { + printf("Requesting the actual payload URL with HTTP...\n"); + ret = http_getactual_payloadurl(payloadurl, payloadurl, sizeof(payloadurl)); + if(ret!=0) + { + printf("Failed to request the actual payload URL: 0x%08x.\n", (unsigned int)ret); + if(ret==0xd8a0a046) + { + printf("No usable Internet-connection is likely available.\n"); + } + else + { + printf("If the server isn't down, and the HTTP request was actually done, this may mean your system-version or region isn't supported by the hblauncher-payload currently.\n"); + } + return ret; + } + + printf("Downloading the actual payload with HTTP...\n"); + ret = http_download_payload(payloadurl, &payloadsize); + if(ret!=0) + { + printf("Failed to download the actual payload with HTTP: 0x%08x.\n", (unsigned int)ret); + if(ret==0xd8a0a046) + { + printf("No usable Internet-connection is likely available.\n"); + } + else + { + printf("If the server isn't down, and the HTTP request was actually done, this may mean your system-version or region isn't supported by the hblauncher-payload currently.\n"); + } + return ret; + } + + if(ret==0)payload_src = 1; + } + + printf("Initializing payload data etc...\n"); + + payloadsize_aligned = (payloadsize + 0xfff) & ~0xfff; + if(payloadsize_aligned > PAYLOAD_TEXTMAXSIZE) + { + printf("Invalid payload size: 0x%08x.\n", (unsigned int)payloadsize); + ret = -3; + return ret; + } + + if(payload_src) + { + hidScanInput(); + + if(!(hidKeysHeld() & KEY_Y)) + { + printf("Saving the downloaded payload to SD since the Y button isn't pressed...\n"); + ret = savesd_payload(payload_sdpath, payloadsize); + + if(ret!=0) + { + printf("Payload saving failed: 0x%08x.\n", (unsigned int)ret); + } + else + { + printf("Payload saving was successful.\n"); + } + } + else + { + printf("Skipping saving the downloaded payload to SD since the Y button is pressed.\n"); + } + } + + memcpy(PAYLOAD_TEXTADDR, filebuffer, payloadsize_aligned); + memset(filebuffer, 0, filebuffer_maxsize); + + ret = svcFlushProcessDataCache(0xffff8001, PAYLOAD_TEXTADDR, payloadsize_aligned);//Flush dcache for the payload which was copied into .text. Since that area was never executed, icache shouldn't be an issue. + if(ret!=0) + { + printf("svcFlushProcessDataCache failed: 0x%08x.\n", (unsigned int)ret); + return ret; + } + + paramblk = linearMemAlign(0x10000, 0x1000); + if(paramblk==NULL) + { + ret = 0xfe; + printf("Failed to alloc the paramblk.\n"); + return ret; + } + + httpcExit(); + + memset(paramblk, 0, 0x10000); + + paramblk[0x1c>>2] = (u32)gxlowcmd_4; + paramblk[0x20>>2] = (u32)gsp_flushdcache; + paramblk[0x48>>2] = 0x8d;//flags + paramblk[0x58>>2] = (u32)&gspGpuHandle; + + printf("Jumping into the payload...\n"); + + funcptr = (void*)PAYLOAD_TEXTADDR; + funcptr(paramblk, (u32*)(0x10000000-0x1000)); + + ret = 0xff; + printf("The payload returned back into the app, this should *never* happen with the actual hblauncher-payload.\n"); + + return ret; +} + +int main(int argc, char **argv) +{ + Result ret = 0; + u32 pos; + Handle kproc_handledup=0; + + // Initialize services + gfxInitDefault(); + + consoleInit(GFX_BOTTOM, NULL); + + printf("hblauncher_loader %s by yellows8.\n", VERSION); + + ret = svcDuplicateHandle(&kproc_handledup, 0xffff8001); + if(ret!=0)printf("svcDuplicateHandle() with the current proc-handle failed: 0x%08x.\n", (unsigned int)ret); + + if(ret==0) + { + for(pos=0; pos> 2], 0x0, 0x1000, MEMOP_PROT, MEMPERM_READ | MEMPERM_WRITE | MEMPERM_EXECUTE); + if(ret!=0) + { + printf("svcControlProcessMemory with pos=0x%x failed: 0x%08x.\n", (unsigned int)pos, (unsigned int)ret); + break; + } + } + } + + ret = httpcInit(0); + if(ret!=0) + { + printf("Failed to initialize HTTPC: 0x%08x.\n", (unsigned int)ret); + if(ret==0xd8e06406) + { + printf("The HTTPC service is inaccessible.\n"); + } + } + + if(ret==0) + { + filebuffer_maxsize = PAYLOAD_TEXTMAXSIZE; + + filebuffer = (u8*)malloc(filebuffer_maxsize); + if(filebuffer==NULL) + { + printf("Failed to allocate memory.\n"); + ret = -1; + } + else + { + memset(filebuffer, 0, filebuffer_maxsize); + } + } + + ret = load_hblauncher(); + + free(filebuffer); + + httpcExit(); + + if(ret!=0 && ret!=0xd8a0a046)printf("An error occured, please report this to here if it persists(or comment on an already existing issue if needed), with an image of your 3DS system: https://github.com/yellows8/hblauncher_loader/issues\n"); + + printf("Press the START button to exit.\n"); + // Main loop + while (aptMainLoop()) + { + gspWaitForVBlank(); + hidScanInput(); + + u32 kDown = hidKeysDown(); + if (kDown & KEY_START) + break; + } + + // Exit services + gfxExit(); + return 0; +} + diff --git a/source/start.s b/source/start.s new file mode 100644 index 0000000..c7bbb77 --- /dev/null +++ b/source/start.s @@ -0,0 +1,100 @@ +.global _init +.global _fini + +.type _init STT_FUNC +.type _fini STT_FUNC + +.global PAYLOAD_TEXTADDR +.global PAYLOAD_TEXTEND +.global PAYLOAD_TEXTMAXSIZE + +@--------------------------------------------------------------------------------- +@ 3DS processor selection +@--------------------------------------------------------------------------------- + .cpu mpcore +@--------------------------------------------------------------------------------- + +@--------------------------------------------------------------------------------- + .section ".init" + .global _start, __service_ptr, __apt_appid, __heap_size, __linear_heap_size, __system_arglist, __system_runflags +@--------------------------------------------------------------------------------- + .align 2 + .arm +@--------------------------------------------------------------------------------- +_start: +@--------------------------------------------------------------------------------- + b startup + .ascii "_prm" +__service_ptr: + .word 0 @ Pointer to service handle override list -- if non-NULL it is assumed that we have been launched from a homebrew launcher +__apt_appid: + .word 0x300 @ Program APPID +__heap_size: + .word 24*1024*1024 @ Default heap size (24 MiB) +__linear_heap_size: + .word 32*1024*1024 @ Default linear heap size (32 MiB) +__system_arglist: + .word 0 @ Pointer to argument list (argc (u32) followed by that many NULL terminated strings) +__system_runflags: + .word 0 @ Flags to signal runtime restrictions to ctrulib +startup: + @ Save return address + mov r4, lr + + @ Clear the BSS section + ldr r0, =__bss_start__ + ldr r1, =__bss_end__ + sub r1, r1, r0 + bl ClearMem + + @ System initialization + mov r0, r4 + bl initSystem + + @ Set up argc/argv arguments for main() + ldr r0, =__system_argc + ldr r1, =__system_argv + ldr r0, [r0] + ldr r1, [r1] + + @ Jump to user code + ldr r3, =main + ldr lr, =__ctru_exit + bx r3 +.pool + +@--------------------------------------------------------------------------------- +@ Clear memory to 0x00 if length != 0 +@ r0 = Start Address +@ r1 = Length +@--------------------------------------------------------------------------------- +ClearMem: +@--------------------------------------------------------------------------------- + mov r2, #3 @ Round down to nearest word boundary + add r1, r1, r2 @ Shouldn't be needed + bics r1, r1, r2 @ Clear 2 LSB (and set Z) + bxeq lr @ Quit if copy size is 0 + + mov r2, #0 +ClrLoop: + stmia r0!, {r2} + subs r1, r1, #4 + bne ClrLoop + + bx lr + +_init: +bx lr + +_fini: +bx lr + +.space ((_start + 0x1000) - .) @ Pad to otherapp payload start. +PAYLOAD_TEXTADDR: +.space 0x10000 @ More than what's needed at the time of writing, but whatever. +PAYLOAD_TEXTEND: +.word 0 + +PAYLOAD_TEXTMAXSIZE: +.word (PAYLOAD_TEXTEND - PAYLOAD_TEXTADDR) +