Add files via upload
This commit is contained in:
parent
c991759931
commit
fc36c5f436
104
CMakeLists.txt
Normal file
104
CMakeLists.txt
Normal file
|
@ -0,0 +1,104 @@
|
|||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
if(NOT DEFINED CMAKE_TOOLCHAIN_FILE)
|
||||
if(DEFINED ENV{VITASDK})
|
||||
set(CMAKE_TOOLCHAIN_FILE "$ENV{VITASDK}/share/vita.toolchain.cmake" CACHE PATH "toolchain file")
|
||||
else()
|
||||
message(FATAL_ERROR "Please define VITASDK to point to your SDK path!")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
project(FasterARK)
|
||||
|
||||
include("${VITASDK}/share/vita.cmake" REQUIRED)
|
||||
|
||||
set(VITA_APP_NAME "FasterARK")
|
||||
set(VITA_TITLEID "FASTERARK")
|
||||
|
||||
set(VITA_VERSION "01.00")
|
||||
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-q -Wall -fno-lto")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||
|
||||
set(VITA_MKSFOEX_FLAGS "${VITA_MKSFOEX_FLAGS} -s CATEGORY=gdb")
|
||||
set(VITA_MAKE_FSELF_FLAGS "${VITA_MAKE_FSELF_FLAGS}")
|
||||
|
||||
include_directories(
|
||||
)
|
||||
|
||||
link_directories(
|
||||
${CMAKE_CURRENT_BINARY_DIR}
|
||||
)
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
src/main.c
|
||||
src/ui.c
|
||||
src/install.c
|
||||
src/io.c
|
||||
src/promote.c
|
||||
src/pbp.c
|
||||
src/sha256
|
||||
)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
|
||||
vita2d
|
||||
z
|
||||
c
|
||||
m
|
||||
png
|
||||
jpeg
|
||||
SceGxm_stub
|
||||
SceSysmodule_stub
|
||||
ScePgf_stub
|
||||
ScePvf_stub
|
||||
SceCtrl_stub
|
||||
SceCommonDialog_stub
|
||||
|
||||
SceLibKernel_stub
|
||||
SceIofilemgr_stub
|
||||
SceAppMgr_stub
|
||||
SceDisplay_stub
|
||||
SceVshBridge_stub
|
||||
ScePromoterUtil_stub
|
||||
taihen_stub
|
||||
)
|
||||
|
||||
vita_create_self(eboot.bin ${PROJECT_NAME} UNSAFE)
|
||||
|
||||
vita_create_vpk(${PROJECT_NAME}.vpk ${VITA_TITLEID} eboot.bin
|
||||
VERSION ${VITA_VERSION}
|
||||
NAME ${VITA_APP_NAME}
|
||||
|
||||
FILE sce_sys/icon0.png sce_sys/icon0.png
|
||||
FILE sce_sys/livearea/contents/bg.png sce_sys/livearea/contents/bg.png
|
||||
FILE sce_sys/livearea/contents/template.xml sce_sys/livearea/contents/template.xml
|
||||
|
||||
FILE res/rif/game.rif rif/game.rif
|
||||
FILE res/psp/EBOOT.PBP psp/EBOOT.PBP
|
||||
FILE res/psp/PBOOT.PBP psp/PBOOT.PBP
|
||||
FILE res/save/ARK_01234/ARK.BIN save/ARK_01234/ARK.BIN
|
||||
FILE res/save/ARK_01234/ARK4.BIN save/ARK_01234/ARK4.BIN
|
||||
FILE res/save/ARK_01234/ARKX.BIN save/ARK_01234/ARKX.BIN
|
||||
FILE res/save/ARK_01234/FLASH0.ARK save/ARK_01234/FLASH0.ARK
|
||||
FILE res/save/ARK_01234/H.BIN save/ARK_01234/H.BIN
|
||||
FILE res/save/ARK_01234/ICON0.PNG save/ARK_01234/ICON0.PNG
|
||||
FILE res/save/ARK_01234/IDSREG.PRX save/ARK_01234/IDSREG.PRX
|
||||
FILE res/save/ARK_01234/K.BIN save/ARK_01234/K.BIN
|
||||
FILE res/save/ARK_01234/LANG.ARK save/ARK_01234/LANG.ARK
|
||||
FILE res/save/ARK_01234/MEDIASYN.PRX save/ARK_01234/MEDIASYN.PRX
|
||||
FILE res/save/ARK_01234/PARAM.SFO save/ARK_01234/PARAM.SFO
|
||||
FILE res/save/ARK_01234/POPS.PRX save/ARK_01234/POPS.PRX
|
||||
FILE res/save/ARK_01234/POPSMAN.PRX save/ARK_01234/POPSMAN.PRX
|
||||
FILE res/save/ARK_01234/PS1SPU.PRX save/ARK_01234/PS1SPU.PRX
|
||||
FILE res/save/ARK_01234/RECOVERY.PBP save/ARK_01234/RECOVERY.PBP
|
||||
FILE res/save/ARK_01234/RECOVERY.PRX save/ARK_01234/RECOVERY.PRX
|
||||
FILE res/save/ARK_01234/SAVEDATA.BIN save/ARK_01234/SAVEDATA.BIN
|
||||
FILE res/save/ARK_01234/THEME.ARK save/ARK_01234/THEME.ARK
|
||||
FILE res/save/ARK_01234/UPDATER.TXT save/ARK_01234/UPDATER.TXT
|
||||
FILE res/save/ARK_01234/USBDEV.PRX save/ARK_01234/USBDEV.PRX
|
||||
FILE res/save/ARK_01234/VBOOT.PBP save/ARK_01234/VBOOT.PBP
|
||||
FILE res/save/ARK_01234/VSHMENU.PRX save/ARK_01234/VSHMENU.PRX
|
||||
FILE res/save/ARK_01234/XBOOT.PBP save/ARK_01234/XBOOT.PBP
|
||||
FILE res/save/ARK_01234/XMBCTRL.PRX save/ARK_01234/XMBCTRL.PRX
|
||||
)
|
BIN
res/psp/EBOOT.PBP
Normal file
BIN
res/psp/EBOOT.PBP
Normal file
Binary file not shown.
BIN
res/psp/PBOOT.PBP
Normal file
BIN
res/psp/PBOOT.PBP
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/ARK.BIN
Normal file
BIN
res/save/ARK_01234/ARK.BIN
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/ARK4.BIN
Normal file
BIN
res/save/ARK_01234/ARK4.BIN
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/ARKX.BIN
Normal file
BIN
res/save/ARK_01234/ARKX.BIN
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/FLASH0.ARK
Normal file
BIN
res/save/ARK_01234/FLASH0.ARK
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/H.BIN
Normal file
BIN
res/save/ARK_01234/H.BIN
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/ICON0.PNG
Normal file
BIN
res/save/ARK_01234/ICON0.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 10 KiB |
BIN
res/save/ARK_01234/IDSREG.PRX
Normal file
BIN
res/save/ARK_01234/IDSREG.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/K.BIN
Normal file
BIN
res/save/ARK_01234/K.BIN
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/LANG.ARK
Normal file
BIN
res/save/ARK_01234/LANG.ARK
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/MEDIASYN.PRX
Normal file
BIN
res/save/ARK_01234/MEDIASYN.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/PARAM.SFO
Normal file
BIN
res/save/ARK_01234/PARAM.SFO
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/POPS.PRX
Normal file
BIN
res/save/ARK_01234/POPS.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/POPSMAN.PRX
Normal file
BIN
res/save/ARK_01234/POPSMAN.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/PS1SPU.PRX
Normal file
BIN
res/save/ARK_01234/PS1SPU.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/RECOVERY.PBP
Normal file
BIN
res/save/ARK_01234/RECOVERY.PBP
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/RECOVERY.PRX
Normal file
BIN
res/save/ARK_01234/RECOVERY.PRX
Normal file
Binary file not shown.
1
res/save/ARK_01234/SAVEDATA.BIN
Normal file
1
res/save/ARK_01234/SAVEDATA.BIN
Normal file
|
@ -0,0 +1 @@
|
|||
םְt–NYD<>9‡¡<16>”ֻ₪\״P«י²™ןµל
|
BIN
res/save/ARK_01234/THEME.ARK
Normal file
BIN
res/save/ARK_01234/THEME.ARK
Normal file
Binary file not shown.
1
res/save/ARK_01234/UPDATER.TXT
Normal file
1
res/save/ARK_01234/UPDATER.TXT
Normal file
|
@ -0,0 +1 @@
|
|||
http://ark-4.ddns.net
|
BIN
res/save/ARK_01234/USBDEV.PRX
Normal file
BIN
res/save/ARK_01234/USBDEV.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/VBOOT.PBP
Normal file
BIN
res/save/ARK_01234/VBOOT.PBP
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/VSHMENU.PRX
Normal file
BIN
res/save/ARK_01234/VSHMENU.PRX
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/XBOOT.PBP
Normal file
BIN
res/save/ARK_01234/XBOOT.PBP
Normal file
Binary file not shown.
BIN
res/save/ARK_01234/XMBCTRL.PRX
Normal file
BIN
res/save/ARK_01234/XMBCTRL.PRX
Normal file
Binary file not shown.
BIN
sce_sys/icon0.png
Normal file
BIN
sce_sys/icon0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 413 B |
BIN
sce_sys/livearea/contents/bg.png
Normal file
BIN
sce_sys/livearea/contents/bg.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 291 KiB |
7
sce_sys/livearea/contents/template.xml
Normal file
7
sce_sys/livearea/contents/template.xml
Normal file
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<livearea style="a1" format-ver="01.00" content-rev="1">
|
||||
<livearea-background>
|
||||
<image>bg.png</image>
|
||||
</livearea-background>
|
||||
</livearea>
|
84
src/install.c
Normal file
84
src/install.c
Normal file
|
@ -0,0 +1,84 @@
|
|||
#include <vitasdk.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "io.h"
|
||||
#include "promote.h"
|
||||
#include "pbp.h"
|
||||
#include "install.h"
|
||||
#include "ui.h"
|
||||
|
||||
|
||||
void createPspEmuDirectories() {
|
||||
|
||||
CreateDirAndUpdateUi("ux0:pspemu");
|
||||
CreateDirAndUpdateUi("ux0:pspemu/PSP");
|
||||
CreateDirAndUpdateUi("ux0:pspemu/PSP/SAVEDATA");
|
||||
|
||||
CreateDirAndUpdateUi("ux0:pspemu/temp");
|
||||
CreateDirAndUpdateUi("ux0:pspemu/temp/game");
|
||||
CreateDirAndUpdateUi("ux0:pspemu/temp/game/PSP");
|
||||
CreateDirAndUpdateUi("ux0:pspemu/temp/game/PSP/GAME");
|
||||
CreateDirAndUpdateUi("ux0:pspemu/temp/game/PSP/LICENSE");
|
||||
}
|
||||
|
||||
|
||||
void genEbootSignature(char* ebootPath) {
|
||||
char ebootSigFilePath[MAX_PATH];
|
||||
char ebootSig[0x200];
|
||||
unsigned char pbpHash[0x20];
|
||||
|
||||
int swVer = 0;
|
||||
|
||||
memset(ebootSig, 0x00, sizeof(ebootSig));
|
||||
memset(pbpHash, 0x00, sizeof(pbpHash));
|
||||
|
||||
snprintf(ebootSigFilePath, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s/__sce_ebootpbp", TITLE_ID);
|
||||
|
||||
updateUi("Calculating EBOOT.PBP hash ...");
|
||||
HashPbp(ebootPath, pbpHash);
|
||||
|
||||
updateUi("Generating EBOOT.PBP Signature ...");
|
||||
int res = _vshNpDrmEbootSigGenPsp(ebootPath, pbpHash, ebootSig, &swVer);
|
||||
if(res >= 0) {
|
||||
WriteFile(ebootSigFilePath, ebootSig, sizeof(ebootSig));
|
||||
}
|
||||
}
|
||||
|
||||
void placePspGameData() {
|
||||
char gameFolder[MAX_PATH];
|
||||
char ebootFile[MAX_PATH];
|
||||
char pbootFile[MAX_PATH];
|
||||
char rifFile[MAX_PATH];
|
||||
|
||||
// create game folder .
|
||||
snprintf(gameFolder, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s", TITLE_ID);
|
||||
CreateDirAndUpdateUi(gameFolder);
|
||||
|
||||
// get path to EBOOT.PBP and PBOOT.PBP
|
||||
snprintf(ebootFile, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s/EBOOT.PBP", TITLE_ID);
|
||||
snprintf(pbootFile, MAX_PATH, "ux0:/pspemu/temp/game/PSP/GAME/%s/PBOOT.PBP", TITLE_ID);
|
||||
snprintf(rifFile, MAX_PATH, "ux0:/pspemu/temp/game/PSP/LICENSE/%s.rif", CONTENT_ID);
|
||||
|
||||
CopyFileAndUpdateUi("app0:/psp/EBOOT.PBP", ebootFile);
|
||||
CopyFileAndUpdateUi("app0:/psp/PBOOT.PBP", pbootFile);
|
||||
CopyFileAndUpdateUi("app0:/rif/game.rif", rifFile);
|
||||
|
||||
genEbootSignature(ebootFile);
|
||||
}
|
||||
void createBubble() {
|
||||
updateUi("Promoting ...");
|
||||
promoteCma("ux0:/pspemu/temp/game", TITLE_ID, SCE_PKG_TYPE_PSP);
|
||||
}
|
||||
|
||||
void copySaveFiles() {
|
||||
CopyTree("app0:/save", "ux0:/pspemu/PSP/SAVEDATA");
|
||||
}
|
||||
|
||||
void doInstall() {
|
||||
createPspEmuDirectories();
|
||||
placePspGameData();
|
||||
createBubble();
|
||||
copySaveFiles();
|
||||
}
|
8
src/install.h
Normal file
8
src/install.h
Normal file
|
@ -0,0 +1,8 @@
|
|||
#define TITLE_ID "NPUZ01234"
|
||||
#define CONTENT_ID "IP9100-PCSI00011_00-PSMRUNTIME000000"
|
||||
|
||||
void createPspEmuDirectories();
|
||||
void placePspGameData();
|
||||
void createBubble();
|
||||
void copySaveFiles();
|
||||
void doInstall();
|
103
src/io.c
Normal file
103
src/io.c
Normal file
|
@ -0,0 +1,103 @@
|
|||
#include <vitasdk.h>
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include "io.h"
|
||||
#include "ui.h"
|
||||
|
||||
void CopyFileAndUpdateUi(char* src, char* dst) {
|
||||
char msg[MAX_PATH+0x100];
|
||||
snprintf(msg, sizeof(msg), "Copying %s ...", src);
|
||||
updateUi(msg);
|
||||
|
||||
CopyFile(src, dst);
|
||||
}
|
||||
|
||||
|
||||
void CreateDirAndUpdateUi(char* dir) {
|
||||
char msg[MAX_PATH+0x100];
|
||||
snprintf(msg, sizeof(msg), "Creating directory %s ...", dir);
|
||||
updateUi(msg);
|
||||
|
||||
sceIoMkdir(dir, 0006);
|
||||
}
|
||||
|
||||
int WriteFile(const char *file, void *buf, int size) {
|
||||
SceUID fd = sceIoOpen(file, SCE_O_WRONLY | SCE_O_CREAT , 0777);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
int written = sceIoWrite(fd, buf, size);
|
||||
|
||||
sceIoClose(fd);
|
||||
return written;
|
||||
}
|
||||
|
||||
int ReadFile(const char *file, void *buf, int size) {
|
||||
SceUID fd = sceIoOpen(file,SCE_O_RDONLY, 0777);
|
||||
if (fd < 0)
|
||||
return fd;
|
||||
|
||||
int read = sceIoRead(fd, buf, size);
|
||||
|
||||
sceIoClose(fd);
|
||||
return read;
|
||||
}
|
||||
|
||||
size_t GetFileSize(const char *file) {
|
||||
SceIoStat stat;
|
||||
|
||||
int ret = sceIoGetstat(file, &stat);
|
||||
if(ret < 0)
|
||||
return ret;
|
||||
|
||||
return stat.st_size;
|
||||
}
|
||||
|
||||
void CopyFile(const char *file, const char* dstfile) {
|
||||
size_t sz = GetFileSize(file);
|
||||
|
||||
char* buf = malloc(sz);
|
||||
if(buf != NULL) {
|
||||
ReadFile(file, buf, sz);
|
||||
WriteFile(dstfile, buf, sz);
|
||||
free(buf);
|
||||
}
|
||||
}
|
||||
|
||||
void CopyTree(const char* src, const char* dst) {
|
||||
SceUID dfd = sceIoDopen(src);
|
||||
char* srcEnt = malloc(MAX_PATH);
|
||||
memset(srcEnt, 0x00, MAX_PATH);
|
||||
|
||||
char* dstEnt = malloc(MAX_PATH);
|
||||
memset(dstEnt, 0x00, MAX_PATH);
|
||||
|
||||
int dir_read_ret = 0;
|
||||
SceIoDirent* dir = malloc(sizeof(SceIoDirent));
|
||||
do{
|
||||
memset(dir, 0x00, sizeof(SceIoDirent));
|
||||
|
||||
dir_read_ret = sceIoDread(dfd, dir);
|
||||
|
||||
snprintf(srcEnt, MAX_PATH, "%s/%s", src, dir->d_name);
|
||||
snprintf(dstEnt, MAX_PATH, "%s/%s", dst, dir->d_name);
|
||||
|
||||
if(SCE_S_ISDIR(dir->d_stat.st_mode)) {
|
||||
CreateDirAndUpdateUi(dstEnt);
|
||||
CopyTree(srcEnt, dstEnt);
|
||||
}
|
||||
else{
|
||||
CopyFileAndUpdateUi(srcEnt, dstEnt);
|
||||
}
|
||||
|
||||
|
||||
} while(dir_read_ret > 0);
|
||||
|
||||
|
||||
free(dir);
|
||||
sceIoDclose(dfd);
|
||||
|
||||
free(srcEnt);
|
||||
free(dstEnt);
|
||||
}
|
10
src/io.h
Normal file
10
src/io.h
Normal file
|
@ -0,0 +1,10 @@
|
|||
#define MAX_PATH (0x1000)
|
||||
|
||||
size_t GetFileSize(const char *file);
|
||||
void CopyFile(const char *file, const char* dstfile);
|
||||
void CopyTree(const char* src, const char* dst);
|
||||
int ReadFile(const char *file, void *buf, int size);
|
||||
int WriteFile(const char *file, void *buf, int size);
|
||||
|
||||
void CopyFileAndUpdateUi(char* src, char* dst);
|
||||
void CreateDirAndUpdateUi(char* dir);
|
31
src/main.c
Normal file
31
src/main.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
#include <vitasdk.h>
|
||||
#include <vita2d.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "install.h"
|
||||
#include "ui.h"
|
||||
|
||||
void waitCross(){
|
||||
SceCtrlData pad;
|
||||
while(1){
|
||||
memset(&pad, 0x00, sizeof(SceCtrlData));
|
||||
sceCtrlPeekBufferPositive(0, &pad, 1);
|
||||
if(pad.buttons == SCE_CTRL_CROSS)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, const char *argv[]) {
|
||||
uiInit();
|
||||
|
||||
displayMsg("Install?", "Press X to begin installation ...");
|
||||
waitCross();
|
||||
|
||||
doInstall();
|
||||
|
||||
displayMsg("Install Complete!", "Press X to close this application ...");
|
||||
waitCross();
|
||||
|
||||
return 0;
|
||||
}
|
52
src/pbp.c
Normal file
52
src/pbp.c
Normal file
|
@ -0,0 +1,52 @@
|
|||
#include <vitasdk.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "sha256.h"
|
||||
#include "pbp.h"
|
||||
|
||||
int HashPbp(char* eboot_file, unsigned char* out_hash) {
|
||||
unsigned char wbuf[0x7c0];
|
||||
|
||||
// open the pbp file
|
||||
SceUID pbp_fd = sceIoOpen(eboot_file, SCE_O_RDONLY, 0);
|
||||
|
||||
// error check
|
||||
if(pbp_fd < 0)
|
||||
return pbp_fd;
|
||||
|
||||
// inital read
|
||||
int read_sz = sceIoRead(pbp_fd, wbuf, sizeof(wbuf));
|
||||
if(read_sz < sizeof(PbpHeader)) return read_sz;
|
||||
|
||||
// calculate data hash size
|
||||
size_t hash_sz = (((PbpHeader*)wbuf)->data_psar_ptr + 0x1C0000);
|
||||
|
||||
// initalize hash
|
||||
SHA256_CTX ctx;
|
||||
sha256_init(&ctx);
|
||||
|
||||
// first hash
|
||||
sha256_update(&ctx, wbuf, read_sz);
|
||||
size_t total_hashed = read_sz;
|
||||
|
||||
do {
|
||||
read_sz = sceIoRead(pbp_fd, wbuf, sizeof(wbuf));
|
||||
|
||||
if((total_hashed + read_sz) > hash_sz)
|
||||
read_sz = (hash_sz - total_hashed); // calculate remaining
|
||||
|
||||
sha256_update(&ctx, wbuf, read_sz);
|
||||
total_hashed += read_sz;
|
||||
|
||||
if(read_sz < sizeof(wbuf)) // treat EOF as complete
|
||||
total_hashed = hash_sz;
|
||||
|
||||
} while(total_hashed < hash_sz);
|
||||
|
||||
sha256_final(&ctx, out_hash);
|
||||
|
||||
sceIoClose(pbp_fd);
|
||||
|
||||
return 1;
|
||||
}
|
79
src/pbp.h
Normal file
79
src/pbp.h
Normal file
|
@ -0,0 +1,79 @@
|
|||
typedef enum PbpType{
|
||||
PBP_TYPE_NPUMDIMG = 0,
|
||||
PBP_TYPE_PSISOIMG = 1,
|
||||
PBP_TYPE_PSTITLEIMG = 2,
|
||||
PBP_TYPE_UNKNOWN = 3
|
||||
} PbpType;
|
||||
|
||||
// for PSISOIMG and PSTITLEIMG contents
|
||||
|
||||
typedef struct DataPspHeader{
|
||||
SceUInt8 magic[0x4];
|
||||
SceUInt8 unk[0x7C];
|
||||
SceUInt8 unk2[0x32];
|
||||
SceUInt8 unk3[0xE];
|
||||
SceUInt8 hash[0x14];
|
||||
SceUInt8 reserved[0x58];
|
||||
SceUInt8 unk4[0x434];
|
||||
char content_id[0x30];
|
||||
} DataPspHeader;
|
||||
|
||||
// for NPUMDIMG content
|
||||
typedef struct NpUmdImgBody {
|
||||
SceUInt16 sector_size; // 0x0800
|
||||
SceUInt16 unk_2; // 0xE000
|
||||
SceUInt32 unk_4;
|
||||
SceUInt32 unk_8;
|
||||
SceUInt32 unk_12;
|
||||
SceUInt32 unk_16;
|
||||
SceUInt32 lba_start;
|
||||
SceUInt32 unk_24;
|
||||
SceUInt32 nsectors;
|
||||
SceUInt32 unk_32;
|
||||
SceUInt32 lba_end;
|
||||
SceUInt32 unk_40;
|
||||
SceUInt32 block_entry_offset;
|
||||
char disc_id[0x10];
|
||||
SceUInt32 header_start_offset;
|
||||
SceUInt32 unk_68;
|
||||
SceUInt8 unk_72;
|
||||
SceUInt8 bbmac_param;
|
||||
SceUInt8 unk_74;
|
||||
SceUInt8 unk_75;
|
||||
SceUInt32 unk_76;
|
||||
SceUInt32 unk_80;
|
||||
SceUInt32 unk_84;
|
||||
SceUInt32 unk_88;
|
||||
SceUInt32 unk_92;
|
||||
} NpUmdImgBody;
|
||||
|
||||
typedef struct NpUmdImgHeader{
|
||||
SceUInt8 magic[0x08]; // "NPUMDIMG"
|
||||
SceUInt32 key_index; // usually 2, or 3.
|
||||
SceUInt32 block_basis;
|
||||
char content_id[0x30];
|
||||
NpUmdImgBody body;
|
||||
SceUInt8 header_key[0x10];
|
||||
SceUInt8 data_key[0x10];
|
||||
SceUInt8 header_hash[0x10];
|
||||
SceUInt8 padding[0x8];
|
||||
SceUInt8 ecdsa_sig[0x28];
|
||||
} NpUmdImgHeader;
|
||||
|
||||
// generic eboot.pbp header
|
||||
|
||||
typedef struct PbpHeader
|
||||
{
|
||||
char magic[0x4];
|
||||
SceUInt32 version;
|
||||
SceUInt32 param_sfo_ptr;
|
||||
SceUInt32 icon0_png_ptr;
|
||||
SceUInt32 icon1_pmf_ptr;
|
||||
SceUInt32 pic0_png_ptr;
|
||||
SceUInt32 pic1_png_ptr;
|
||||
SceUInt32 snd0_at3_ptr;
|
||||
SceUInt32 data_psp_ptr;
|
||||
SceUInt32 data_psar_ptr;
|
||||
} PbpHeader;
|
||||
|
||||
int HashPbp(char* eboot_file, unsigned char* out_hash);
|
77
src/promote.c
Normal file
77
src/promote.c
Normal file
|
@ -0,0 +1,77 @@
|
|||
#include <vitasdk.h>
|
||||
|
||||
static int loadScePaf() {
|
||||
static uint32_t argp[] = { 0x180000, -1, -1, 1, -1, -1 };
|
||||
|
||||
int result = -1;
|
||||
|
||||
uint32_t buf[4];
|
||||
buf[0] = sizeof(buf);
|
||||
buf[1] = (uint32_t)&result;
|
||||
buf[2] = -1;
|
||||
buf[3] = -1;
|
||||
|
||||
return sceSysmoduleLoadModuleInternalWithArg(SCE_SYSMODULE_INTERNAL_PAF, sizeof(argp), argp, buf);
|
||||
}
|
||||
|
||||
static int unloadScePaf() {
|
||||
uint32_t buf = 0;
|
||||
return sceSysmoduleUnloadModuleInternalWithArg(SCE_SYSMODULE_INTERNAL_PAF, 0, NULL, &buf);
|
||||
}
|
||||
|
||||
int promoteCma(const char *path, const char *titleid, int type) {
|
||||
int res;
|
||||
|
||||
ScePromoterUtilityImportParams promoteArgs;
|
||||
memset(&promoteArgs,0x00,sizeof(ScePromoterUtilityImportParams));
|
||||
strncpy(promoteArgs.path,path,0x7F);
|
||||
strncpy(promoteArgs.titleid,titleid,0xB);
|
||||
promoteArgs.type = type;
|
||||
promoteArgs.attribute = 0x1;
|
||||
|
||||
res = loadScePaf();
|
||||
if (res < 0) {
|
||||
sceClibPrintf("loadScePaf: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = sceSysmoduleLoadModuleInternal(SCE_SYSMODULE_INTERNAL_PROMOTER_UTIL);
|
||||
if (res < 0) {
|
||||
sceClibPrintf("sceSysmoduleLoadModuleInternal: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = scePromoterUtilityInit();
|
||||
if (res < 0) {
|
||||
sceClibPrintf("scePromoterUtilityInit: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = scePromoterUtilityPromoteImport(&promoteArgs);
|
||||
if (res < 0) {
|
||||
sceClibPrintf("scePromoterUtilityPromoteImport: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = scePromoterUtilityExit();
|
||||
if (res < 0) {
|
||||
sceClibPrintf("scePromoterUtilityExit: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
res = sceSysmoduleUnloadModuleInternal(SCE_SYSMODULE_INTERNAL_PROMOTER_UTIL);
|
||||
if (res < 0) {
|
||||
sceClibPrintf("sceSysmoduleUnloadModuleInternal: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
res = unloadScePaf();
|
||||
if (res < 0)
|
||||
if (res < 0) {
|
||||
sceClibPrintf("unloadScePaf: %x\n", res);
|
||||
return res;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
1
src/promote.h
Normal file
1
src/promote.h
Normal file
|
@ -0,0 +1 @@
|
|||
int promoteCma(const char *path, const char *titleid, int type);
|
158
src/sha256.c
Normal file
158
src/sha256.c
Normal file
|
@ -0,0 +1,158 @@
|
|||
/*********************************************************************
|
||||
* Filename: sha256.c
|
||||
* Author: Brad Conte (brad AT bradconte.com)
|
||||
* Copyright:
|
||||
* Disclaimer: This code is presented "as is" without any guarantees.
|
||||
* Details: Implementation of the SHA-256 hashing algorithm.
|
||||
SHA-256 is one of the three algorithms in the SHA2
|
||||
specification. The others, SHA-384 and SHA-512, are not
|
||||
offered in this implementation.
|
||||
Algorithm specification can be found here:
|
||||
* http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf
|
||||
This implementation uses little endian byte order.
|
||||
*********************************************************************/
|
||||
|
||||
/*************************** HEADER FILES ***************************/
|
||||
#include <stdlib.h>
|
||||
#include <memory.h>
|
||||
#include "sha256.h"
|
||||
|
||||
/****************************** MACROS ******************************/
|
||||
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
|
||||
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
|
||||
|
||||
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
|
||||
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
|
||||
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
|
||||
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
|
||||
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
|
||||
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
|
||||
|
||||
/**************************** VARIABLES *****************************/
|
||||
static const WORD k[64] = {
|
||||
0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,
|
||||
0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,
|
||||
0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,
|
||||
0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,
|
||||
0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,
|
||||
0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,
|
||||
0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,
|
||||
0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
|
||||
};
|
||||
|
||||
/*********************** FUNCTION DEFINITIONS ***********************/
|
||||
void sha256_transform(SHA256_CTX *ctx, const BYTE data[])
|
||||
{
|
||||
WORD a, b, c, d, e, f, g, h, i, j, t1, t2, m[64];
|
||||
|
||||
for (i = 0, j = 0; i < 16; ++i, j += 4)
|
||||
m[i] = (data[j] << 24) | (data[j + 1] << 16) | (data[j + 2] << 8) | (data[j + 3]);
|
||||
for ( ; i < 64; ++i)
|
||||
m[i] = SIG1(m[i - 2]) + m[i - 7] + SIG0(m[i - 15]) + m[i - 16];
|
||||
|
||||
a = ctx->state[0];
|
||||
b = ctx->state[1];
|
||||
c = ctx->state[2];
|
||||
d = ctx->state[3];
|
||||
e = ctx->state[4];
|
||||
f = ctx->state[5];
|
||||
g = ctx->state[6];
|
||||
h = ctx->state[7];
|
||||
|
||||
for (i = 0; i < 64; ++i) {
|
||||
t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
|
||||
t2 = EP0(a) + MAJ(a,b,c);
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = d + t1;
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = t1 + t2;
|
||||
}
|
||||
|
||||
ctx->state[0] += a;
|
||||
ctx->state[1] += b;
|
||||
ctx->state[2] += c;
|
||||
ctx->state[3] += d;
|
||||
ctx->state[4] += e;
|
||||
ctx->state[5] += f;
|
||||
ctx->state[6] += g;
|
||||
ctx->state[7] += h;
|
||||
}
|
||||
|
||||
void sha256_init(SHA256_CTX *ctx)
|
||||
{
|
||||
ctx->datalen = 0;
|
||||
ctx->bitlen = 0;
|
||||
ctx->state[0] = 0x6a09e667;
|
||||
ctx->state[1] = 0xbb67ae85;
|
||||
ctx->state[2] = 0x3c6ef372;
|
||||
ctx->state[3] = 0xa54ff53a;
|
||||
ctx->state[4] = 0x510e527f;
|
||||
ctx->state[5] = 0x9b05688c;
|
||||
ctx->state[6] = 0x1f83d9ab;
|
||||
ctx->state[7] = 0x5be0cd19;
|
||||
}
|
||||
|
||||
void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len)
|
||||
{
|
||||
WORD i;
|
||||
|
||||
for (i = 0; i < len; ++i) {
|
||||
ctx->data[ctx->datalen] = data[i];
|
||||
ctx->datalen++;
|
||||
if (ctx->datalen == 64) {
|
||||
sha256_transform(ctx, ctx->data);
|
||||
ctx->bitlen += 512;
|
||||
ctx->datalen = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sha256_final(SHA256_CTX *ctx, BYTE hash[])
|
||||
{
|
||||
WORD i;
|
||||
|
||||
i = ctx->datalen;
|
||||
|
||||
// Pad whatever data is left in the buffer.
|
||||
if (ctx->datalen < 56) {
|
||||
ctx->data[i++] = 0x80;
|
||||
while (i < 56)
|
||||
ctx->data[i++] = 0x00;
|
||||
}
|
||||
else {
|
||||
ctx->data[i++] = 0x80;
|
||||
while (i < 64)
|
||||
ctx->data[i++] = 0x00;
|
||||
sha256_transform(ctx, ctx->data);
|
||||
memset(ctx->data, 0, 56);
|
||||
}
|
||||
|
||||
// Append to the padding the total message's length in bits and transform.
|
||||
ctx->bitlen += ctx->datalen * 8;
|
||||
ctx->data[63] = ctx->bitlen;
|
||||
ctx->data[62] = ctx->bitlen >> 8;
|
||||
ctx->data[61] = ctx->bitlen >> 16;
|
||||
ctx->data[60] = ctx->bitlen >> 24;
|
||||
ctx->data[59] = ctx->bitlen >> 32;
|
||||
ctx->data[58] = ctx->bitlen >> 40;
|
||||
ctx->data[57] = ctx->bitlen >> 48;
|
||||
ctx->data[56] = ctx->bitlen >> 56;
|
||||
sha256_transform(ctx, ctx->data);
|
||||
|
||||
// Since this implementation uses little endian byte ordering and SHA uses big endian,
|
||||
// reverse all the bytes when copying the final state to the output hash.
|
||||
for (i = 0; i < 4; ++i) {
|
||||
hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
|
||||
hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
|
||||
}
|
||||
}
|
34
src/sha256.h
Normal file
34
src/sha256.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*********************************************************************
|
||||
* Filename: sha256.h
|
||||
* Author: Brad Conte (brad AT bradconte.com)
|
||||
* Copyright:
|
||||
* Disclaimer: This code is presented "as is" without any guarantees.
|
||||
* Details: Defines the API for the corresponding SHA1 implementation.
|
||||
*********************************************************************/
|
||||
|
||||
#ifndef SHA256_H
|
||||
#define SHA256_H
|
||||
|
||||
/*************************** HEADER FILES ***************************/
|
||||
#include <stddef.h>
|
||||
|
||||
/****************************** MACROS ******************************/
|
||||
#define SHA256_BLOCK_SIZE 32 // SHA256 outputs a 32 byte digest
|
||||
|
||||
/**************************** DATA TYPES ****************************/
|
||||
typedef unsigned char BYTE; // 8-bit byte
|
||||
typedef unsigned int WORD; // 32-bit word, change to "long" for 16-bit machines
|
||||
|
||||
typedef struct {
|
||||
BYTE data[64];
|
||||
WORD datalen;
|
||||
unsigned long long bitlen;
|
||||
WORD state[8];
|
||||
} SHA256_CTX;
|
||||
|
||||
/*********************** FUNCTION DECLARATIONS **********************/
|
||||
void sha256_init(SHA256_CTX *ctx);
|
||||
void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len);
|
||||
void sha256_final(SHA256_CTX *ctx, BYTE hash[]);
|
||||
|
||||
#endif // SHA256_H
|
83
src/ui.c
Normal file
83
src/ui.c
Normal file
|
@ -0,0 +1,83 @@
|
|||
#include <vitasdk.h>
|
||||
#include <vita2d.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
|
||||
int progress = 0;
|
||||
const int totalProgress = 42; // this is like how many times updateUi is called ..
|
||||
|
||||
vita2d_pgf *pgf;
|
||||
vita2d_pvf *pvf;
|
||||
|
||||
void uiInit() {
|
||||
vita2d_init();
|
||||
vita2d_set_clear_color(RGBA8(0x00, 0x00, 0x00, 0xFF));
|
||||
pgf = vita2d_load_default_pgf();
|
||||
pvf = vita2d_load_default_pvf();
|
||||
}
|
||||
|
||||
void drawTextCenter(int y, char* text) {
|
||||
int width = 0;
|
||||
int height = 0;
|
||||
|
||||
vita2d_pgf_text_dimensions(pgf, 1.0, text, &width, &height);
|
||||
|
||||
int x = ((960 / 2) - (width / 2));
|
||||
vita2d_pgf_draw_text(pgf, x, y, RGBA8(255,255,255,255), 1.0f, text);
|
||||
}
|
||||
|
||||
void drawProgress() {
|
||||
int end = 900;
|
||||
int start = 60;
|
||||
int y = 300;
|
||||
int percent = (int)floor(((float)progress / (float)totalProgress) * 840.0);
|
||||
char percentText[0x100];
|
||||
|
||||
vita2d_draw_line(start, y, end, y, RGBA8(128,128,128,255));
|
||||
vita2d_draw_line(start, y, start + percent, y, RGBA8(0,255,0,255));
|
||||
|
||||
snprintf(percentText, sizeof(percentText), "%i%%", progress);
|
||||
drawTextCenter(320, percentText);
|
||||
}
|
||||
|
||||
void endDraw() {
|
||||
vita2d_end_drawing();
|
||||
vita2d_swap_buffers();
|
||||
}
|
||||
|
||||
void startDraw() {
|
||||
vita2d_start_drawing();
|
||||
vita2d_clear_screen();
|
||||
}
|
||||
|
||||
void drawLines() {
|
||||
vita2d_pgf_draw_text(pgf, 20, 30, RGBA8(255,255,255,255), 1.0f, "FasterARK");
|
||||
vita2d_draw_line(0, 64, 960, 64, RGBA8(255,255,255,255));
|
||||
vita2d_draw_line(0, 544-64, 960, 544-64, RGBA8(255,255,255,255));
|
||||
}
|
||||
|
||||
|
||||
void displayMsg(char* title, char* msg) {
|
||||
startDraw();
|
||||
drawLines();
|
||||
|
||||
drawTextCenter(190, title);
|
||||
drawTextCenter(230, msg);
|
||||
|
||||
endDraw();
|
||||
}
|
||||
|
||||
void updateUi(char* msg) {
|
||||
progress++;
|
||||
|
||||
startDraw();
|
||||
drawLines();
|
||||
|
||||
drawTextCenter(190, "Installing ...");
|
||||
drawTextCenter(230, msg);
|
||||
drawProgress();
|
||||
|
||||
endDraw();
|
||||
}
|
Loading…
Reference in New Issue
Block a user