void poweroff() { if (khaxInit() != 0) { debug("Err: khaxInit"); return; } Handle handle; Result ret = srvGetServiceHandle(&handle, "ptm:s"); if (ret != 0) { debug("Err: srvGetServiceHandle(ptm:s)"); return; } u32 *cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = 0x040700C0; //ShutdownAsync cmdbuf[1] = 0; //? cmdbuf[2] = 0; //? cmdbuf[3] = 0; //? ret = svcSendSyncRequest(handle); if (ret != 0) { debug("Err: srvGetServiceHandle(ptm:s)"); } svcCloseHandle(handle); }
bool ctr::core::init(int argc) { oldErrTab = devoptab_list[STD_ERR]; devoptab_list[STD_ERR] = &debugOpTab; setvbuf(stderr, NULL, _IOLBF, 0); hasLauncher = __service_ptr != 0; bool ret = err::init() && utf::init() && gpu::init() && gput::init() && hid::init() && fs::init(); if(ret) { // Try to acquire kernel access for additional service access. if(hasLauncher) { hasKernel = khaxInit() == 0; } // Not required. battery::init(); wifi::init(); soc::init(); ir::init(); nor::init(); snd::init(); app::init(); news::init(); } return ret; }
bool ctr::core::init(int argc) { oldErrTab = devoptab_list[STD_ERR]; devoptab_list[STD_ERR] = &debugOpTab; setvbuf(stderr, NULL, _IOLBF, 0); hasLauncher = argc > 0; bool ret = err::init() && utf::init() && gpu::init() && gput::init() && hid::init() && fs::init(); if(ret) { // Try to acquire kernel access for additional service access. // libkhax currently only works through Ninjhax 1.x, so only // attempt to use it when we have access to the HB service. if(hasLauncher) { hasKernel = khaxInit() == 0; } // Not required. battery::init(); wifi::init(); soc::init(); ir::init(); nor::init(); snd::init(); app::init(); news::init(); } return ret; }
/* perform firmlaunch. load ARM9 payload before calling this function. otherwise, calling this function simply reboots the handheld */ s32 firm_reboot (void) { s32 fail_stage = 0; fail_stage++; /* platform or firmware not supported, ARM11 exploit failure */ if (setup_exploit_data()) { fail_stage++; /* failure while trying to corrupt svcCreateThread() */ if (khaxInit() == 0) { fail_stage++; /* Firmlaunch failure, ARM9 exploit failure*/ svcBackdoor(priv_firm_reboot); } } /* we do not intend to return ... */ return fail_stage; }
void Player::Init(int argc, char *argv[]) { static bool init = false; frames = 0; if (init) return; // Display a nice version string std::stringstream header; std::string addtl_ver(PLAYER_ADDTL); header << "EasyRPG Player " << PLAYER_VERSION; if (!addtl_ver.empty()) header << " " << addtl_ver; header << " started"; Output::Debug(header.str().c_str()); unsigned int header_width = header.str().length(); header.str(""); header << std::setfill('=') << std::setw(header_width) << "="; Output::Debug(header.str().c_str()); #ifdef GEKKO // Init libfat (Mount SD/USB) if (!fatInitDefault()) { Output::Error("Couldn't mount any storage medium!"); } #elif defined(_3DS) // Starting debug console gfxInitDefault(); consoleInit(GFX_BOTTOM, NULL); APT_SetAppCpuTimeLimit(30); if (osGetKernelVersion() < SYSTEM_VERSION(2, 48, 3)) khaxInit(); // Executing libkhax just to be sure... consoleClear(); // Check if we already have access to csnd:SND, if not, we will perform a kernel privilege escalation Handle csndHandle = 0; use_dsp = false; #ifndef FORCE_DSP srvGetServiceHandleDirect(&csndHandle, "csnd:SND"); if (csndHandle) { Output::Debug("csnd:SND has been selected as audio service."); svcCloseHandle(csndHandle); } else { Output::Debug("csnd:SND is unavailable..."); #endif srvGetServiceHandleDirect(&csndHandle, "dsp::DSP"); if (csndHandle) { Output::Debug("dsp::DSP has been selected as audio service."); use_dsp = true; svcCloseHandle(csndHandle); } else { Output::Error("dsp::DSP is unavailable. Please dump a DSP firmware to use EasyRPG Player. If the problem persists, please report us the issue."); } #ifndef FORCE_DSP } #endif fsInit(); sdmcInit(); #ifndef CITRA3DS_COMPATIBLE romfsInit(); #endif hidInit(); // Enable 804 Mhz mode if on N3DS bool isN3DS; APT_CheckNew3DS(&isN3DS); if (isN3DS) { osSetSpeedupEnable(true); } #endif #if (defined(_WIN32) && defined(NDEBUG) && defined(WINVER) && WINVER >= 0x0600) InitMiniDumpWriter(); #endif srand(time(NULL)); ParseCommandLine(argc, argv); #ifdef EMSCRIPTEN Output::IgnorePause(true); // Create initial directory structure in our private area // Retrieve save directory from persistent storage EM_ASM( FS.mkdir("easyrpg"); FS.chdir("easyrpg"); var dirs = ['Backdrop', 'Battle', 'Battle2', 'BattleCharSet', 'BattleWeapon', 'CharSet', 'ChipSet', 'FaceSet', 'Frame', 'GameOver', 'Monster', 'Movie', 'Music', 'Panorama', 'Picture', 'Sound', 'System', 'System2', 'Title', 'Save']; dirs.forEach(function(dir) { FS.mkdir(dir) }); FS.mount(IDBFS, {}, 'Save'); FS.syncfs(true, function(err) { }); );
int main(int argc, char **argv) { srvInit(); aptInit(); gfxInitDefault(); acInit(); cfguInit(); httpcInit(); ptmuInit(); hidInit(); irrstInit(); aptOpenSession(); Result ret=APT_SetAppCpuTimeLimit(30); aptCloseSession(); fsInit(); ftp_state = false; isTopLCDOn = true; isBottomLCDOn = true; Handle fileHandle; u64 size; u32 bytesRead; int restore; // Check user build and enables kernel access if (nsInit()==0){ CIA_MODE = true; nsExit(); }else CIA_MODE = false; isNinjhax2 = false; if (!hbInit()) khaxInit(); else isNinjhax2 = true; // Select Audio System (csnd:SND preferred) if (csndInit() == 0){ csndAccess = true; csndExit(); }else csndAccess = false; // Init Audio-Device int i = 0; for (i=0;i < 32; i++){ audioChannels[i] = false; if (!isNinjhax2 && (i < 0x08)) audioChannels[i] = true; else if (csndAccess && (i < 0x08)) audioChannels[i] = true; } // Set main script char path[256]; if (argc > 0){ int latest_slash = 0; int i=5; while (argv[0][i] != '\0'){ if (argv[0][i] == '/') latest_slash = i; i++; } strcpy(path,&argv[0][5]); path[latest_slash-5] = 0; strcpy(start_dir,path); strcpy(cur_dir,path); // Set current dir strcat(path,"/index.lua"); }else{ strcpy(start_dir,"/"); strcpy(cur_dir,"/"); // Set current dir for GW Mode strcpy(path,"/index.lua"); } while(aptMainLoop()) { restore=0; char error[2048]; // Load main script FS_Path filePath=fsMakePath(PATH_ASCII, path); FS_Archive script=(FS_Archive){ARCHIVE_SDMC, (FS_Path){PATH_EMPTY, 1, (u8*)""}}; Result ret = FSUSER_OpenFileDirectly(&fileHandle, script, filePath, FS_OPEN_READ, 0x00000000); if (!ret){ FSFILE_GetSize(fileHandle, &size); buffer = (unsigned char*)(malloc((size+1) * sizeof (char))); FSFILE_Read(fileHandle, &bytesRead, 0x0, buffer, size); buffer[size]=0; FSFILE_Close(fileHandle); svcCloseHandle(fileHandle); errMsg = runScript((const char*)buffer, true); free(buffer); }else errMsg = "index.lua file not found."; // Force LCDs power on if ((!isTopLCDOn) || (!isBottomLCDOn)){ gspLcdInit(); if (!isTopLCDOn) GSPLCD_PowerOnBacklight(GSPLCD_SCREEN_TOP); if (!isBottomLCDOn) GSPLCD_PowerOnBacklight(GSPLCD_SCREEN_BOTTOM); gspLcdExit(); isTopLCDOn = true; isBottomLCDOn = true; } // Fake error to force interpreter shutdown if (strstr(errMsg, "lpp_exit_04")) break; if (ftp_state) ftp_exit(); ftp_state = false; int connfd; while (restore==0){ gspWaitForVBlank(); RefreshScreen(); ClearScreen(0); ClearScreen(1); strcpy(error,"Error: "); strcat(error,errMsg); if (ftp_state){ u32 ip=(u32)gethostid(); char ip_address[64]; strcat(error,"\n\nPress A to restart\nPress B to exit\nPress Y to enable FTP server\n\nFTP state: ON\nIP: "); sprintf(ip_address,"%lu.%lu.%lu.%lu", ip & 0xFF, (ip>>8)&0xFF, (ip>>16)&0xFF, (ip>>24)&0xFF); strcat(error,ip_address); strcat(error,"\nPort: 5000"); if(connfd<0)connfd=ftp_getConnection(); else{ int ret=ftp_frame(connfd); if(ret==1) connfd=-1; } }else strcat(error,"\n\nPress A to restart\nPress B to exit\nPress Y to enable FTP server\n\nFTP state: OFF"); DebugOutput(error); hidScanInput(); if(hidKeysDown() & KEY_A){ strcpy(cur_dir,start_dir); restore=1; }else if(hidKeysDown() & KEY_B){ restore=2; }else if(hidKeysDown() & KEY_Y){ if (!ftp_state){ u32 wifiStatus; if ((u32)ACU_GetWifiStatus(&wifiStatus) != 0xE0A09D2E){ if (wifiStatus != 0){ ftp_init(); connfd = -1; ftp_state = true; } } } } gfxFlushBuffers(); gfxSwapBuffers(); } if (ftp_state) ftp_exit(); if (isCSND){ if (csndAccess) csndExit(); else ndspExit(); isCSND = false; } if (restore==2){ break; } }