uint64_t c_gamePKG::GetPKGSize(char* szFilePath) { CellFsStat sb; memset(&sb, 0, sizeof(CellFsStat)); cellFsStat(szFilePath, &sb); return sb.st_size; }
static bool path_stat(const char *path, enum stat_mode mode) { #if defined(VITA) || defined(PSP) SceIoStat buf; char *tmp = strdup(path); size_t len = strlen(tmp); if (tmp[len-1] == '/') tmp[len-1]='\0'; if (sceIoGetstat(tmp, &buf) < 0) { free(tmp); return false; } free(tmp); #elif defined(__CELLOS_LV2__) CellFsStat buf; if (cellFsStat(path, &buf) < 0) return false; #elif defined(_WIN32) DWORD ret = GetFileAttributes(path); if (ret == INVALID_FILE_ATTRIBUTES) return false; #else struct stat buf; if (stat(path, &buf) < 0) return false; #endif switch (mode) { case IS_DIRECTORY: #if defined(VITA) || defined(PSP) return FIO_S_ISDIR(buf.st_mode); #elif defined(__CELLOS_LV2__) return ((buf.st_mode & S_IFMT) == S_IFDIR); #elif defined(_WIN32) return (ret & FILE_ATTRIBUTE_DIRECTORY); #else return S_ISDIR(buf.st_mode); #endif case IS_CHARACTER_SPECIAL: #if defined(VITA) || defined(PSP) || defined(__CELLOS_LV2__) || defined(_WIN32) return false; #else return S_ISCHR(buf.st_mode); #endif case IS_VALID: return true; } return false; }
/* * Function: check_turnoff * File: main.c * Project: ArtemisPS3-PRX * Description: Checks the turnoff flag * Arguments: * void * Return: 1 if on, 0 if off */ int check_turnoff(void) { if (check_turnoff_delay >= check_turnoff_delay_max) { check_turnoff_delay = 0; CellFsStat stat; return cellFsStat("/dev_hdd0/tmp/turnoff", &stat) == 0; } check_turnoff_delay++; return 1; }
int disable_cobra_stage() { cellFsUtilMount_h("CELL_FS_IOS:BUILTIN_FLSH1", "CELL_FS_FAT", "/dev_habib", 0, 0, 0, 0, 0); CellFsStat stat; cellFsStat(CB_LOCATION, &stat); uint64_t len=stat.st_size; uint8_t *buf; uint64_t size; int src; int dst; page_allocate_auto(NULL, 0x40000, 0x2F, (void **)&buf); if (cellFsOpen(CB_LOCATION, CELL_FS_O_RDONLY, &src, 0, NULL, 0) == 0) { cellFsRead(src, buf, len, &size); cellFsClose(src); } else { page_free(NULL, buf, 0x2F); return -1; } if (cellFsOpen(CB_LOCATION".bak", CELL_FS_O_WRONLY | CELL_FS_O_CREAT | CELL_FS_O_TRUNC, &dst, 0666, NULL, 0) == 0) { cellFsWrite(dst, buf, len, &size); cellFsClose(dst); } else { page_free(NULL, buf, 0x2F); return -1; } page_free(NULL, buf, 0x2F); cellFsUnlink(CB_LOCATION); size=0x5343450000000000; cellFsOpen("/dev_hdd0/tmp/loadoptical", CELL_FS_O_WRONLY | CELL_FS_O_CREAT | CELL_FS_O_TRUNC, &dst, 0666, NULL, 0); cellFsWrite(dst, &size, 4, &size); cellFsClose(dst); return 0; }
int sys_load_mamba(char *mamba_file) { if (mamba_loaded == 1) return ECANCELED; mamba_file = get_secure_user_ptr(mamba_file); CellFsStat stat; int ret = cellFsStat(mamba_file, &stat); if (ret == 0) { int fd; ret = cellFsOpen(mamba_file, CELL_FS_O_RDONLY, &fd, 0, NULL, 0); if (ret == 0) { uint32_t psize = stat.st_size; void *mamba = alloc(psize, 0x27); if (mamba) { uint64_t rs; ret = cellFsRead(fd, mamba, psize, &rs); cellFsClose(fd); if (ret != 0) { dealloc(mamba, 0x27); mamba = NULL; return ret; } mamba_loaded = 1; f_desc_t f; f.toc = (void *)MKA(TOC); int (* func)(void); f.addr = mamba; func = (void *)&f; func(); return 0; } return ENOMEM; } } return ret; }
int main(void) { void *stage2 = NULL; f_desc_t f; int (* func)(void); int ret; #ifdef DEBUG debug_init(); DPRINTF("Stage 1 hello.\n"); #endif f.addr = flash_mount_clone; f.toc = (void *)MKA(TOC); func = (void *)&f; ret = func(); if (ret != 0 && ret != 1) { DPRINTF("Flash mount failed!\n"); } else { CellFsStat stat; DPRINTF("Flash mounted\n"); if (cellFsStat(STAGE2_FILE, &stat) == 0) { int fd; if (cellFsOpen(STAGE2_FILE, CELL_FS_O_RDONLY, &fd, 0, NULL, 0) == 0) { uint32_t psize = stat.st_size; DPRINTF("Payload size = %d\n", psize); stage2 = alloc(psize, 0x27); if (stage2) { uint64_t rs; if (cellFsRead(fd, stage2, psize, &rs) != 0) { DPRINTF("Stage 2 read fail.\n"); dealloc(stage2, 0x27); stage2 = NULL; } } else { DPRINTF("Cannot allocate stage2\n"); } cellFsClose(fd); } } else { DPRINTF("There is no stage 2, booting system.\n"); } } if (stage2) { f.addr = stage2; func = (void *)&f; DPRINTF("Calling stage 2...\n"); func(); } return ret; }
static bool path_stat(const char *path, enum stat_mode mode, int32_t *size) { #if defined(VITA) || defined(PSP) SceIoStat buf; char *tmp = strdup(path); size_t len = strlen(tmp); if (tmp[len-1] == '/') tmp[len-1]='\0'; if (sceIoGetstat(tmp, &buf) < 0) { free(tmp); return false; } free(tmp); #elif defined(__CELLOS_LV2__) CellFsStat buf; if (cellFsStat(path, &buf) < 0) return false; #elif defined(_WIN32) struct _stat buf; char *path_local; wchar_t *path_wide; DWORD file_info; if (!path || !*path) return false; (void)path_wide; (void)path_local; (void)file_info; #if defined(LEGACY_WIN32) path_local = utf8_to_local_string_alloc(path); file_info = GetFileAttributes(path_local); _stat(path_local, &buf); if (path_local) free(path_local); #else path_wide = utf8_to_utf16_string_alloc(path); file_info = GetFileAttributesW(path_wide); _wstat(path_wide, &buf); if (path_wide) free(path_wide); #endif if (file_info == INVALID_FILE_ATTRIBUTES) return false; #else struct stat buf; if (stat(path, &buf) < 0) return false; #endif if (size) *size = (int32_t)buf.st_size; switch (mode) { case IS_DIRECTORY: #if defined(VITA) || defined(PSP) return FIO_S_ISDIR(buf.st_mode); #elif defined(__CELLOS_LV2__) return ((buf.st_mode & S_IFMT) == S_IFDIR); #elif defined(_WIN32) return (file_info & FILE_ATTRIBUTE_DIRECTORY); #else return S_ISDIR(buf.st_mode); #endif case IS_CHARACTER_SPECIAL: #if defined(VITA) || defined(PSP) || defined(__CELLOS_LV2__) || defined(_WIN32) return false; #else return S_ISCHR(buf.st_mode); #endif case IS_VALID: return true; } return false; }
static bool path_stat(const char *path, enum stat_mode mode, int32_t *size) { #if defined(VITA) || defined(PSP) SceIoStat buf; char *tmp = strdup(path); size_t len = strlen(tmp); if (tmp[len-1] == '/') tmp[len-1]='\0'; if (sceIoGetstat(tmp, &buf) < 0) { free(tmp); return false; } free(tmp); #elif defined(__CELLOS_LV2__) CellFsStat buf; if (cellFsStat(path, &buf) < 0) return false; #elif defined(_WIN32) WIN32_FILE_ATTRIBUTE_DATA file_info; GET_FILEEX_INFO_LEVELS fInfoLevelId = GetFileExInfoStandard; DWORD ret = GetFileAttributesEx(path, fInfoLevelId, &file_info); if (ret == 0) return false; #else struct stat buf; if (stat(path, &buf) < 0) return false; #endif #if defined(_WIN32) if (size) *size = file_info.nFileSizeLow; #else if (size) *size = buf.st_size; #endif switch (mode) { case IS_DIRECTORY: #if defined(VITA) || defined(PSP) return FIO_S_ISDIR(buf.st_mode); #elif defined(__CELLOS_LV2__) return ((buf.st_mode & S_IFMT) == S_IFDIR); #elif defined(_WIN32) return (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); #else return S_ISDIR(buf.st_mode); #endif case IS_CHARACTER_SPECIAL: #if defined(VITA) || defined(PSP) || defined(__CELLOS_LV2__) || defined(_WIN32) return false; #else return S_ISCHR(buf.st_mode); #endif case IS_VALID: return true; } return false; }