Il developer Evilnat messo da parte i rancori per la perdita dell’applicazione SEN Enabler trapelato accidentalmente in rete ha rilasciato una propria versione ottimizzata del plugin PS3 VSH Menu.
Il developer ha dichiarato di aver fatto uso di parte del codice utilizzato nel plugin del SEN Enabler ottimizzando le funzioni in un unico thread.
La prima cosa che ho visto, se il plugin viene disabilitato la PS3 non può spegnersi normalmente e avrà bisogno di un arresto forzato, e con il plugin attivato multiMAN presenta schermo nero e ho bisogno di spegnere la PS3, non so se questo è accaduto solo a me, ma con questo miglioramento sembra che il codice sia stato fixato.
Ho aggiunto l’opzione per caricare i file font.png e background.png nella memoria, nel link con il codice sorgente vi mostro come funziona, è semplice, è necessario solo cambiare alcune linee a seconda di dove si desidera caricare i file.
Carica background.png e font.png dalla memoria
Codice
main.c load_png_bitmap(1, NULL, background, background_size); // Load background.png from memory blitting.c Buffer font = load_png(NULL, font_array, font_array_size); // Load font.png from memory
Carica background.png e font.png da file
Codice
main.c load_png_bitmap(1, BACKGROUND_FONT_PATH, NULL, NULL); // Load background.png from file blitting.c Buffer font = load_png(PNG_FONT_PATH, NULL, NULL); // Load font.png from file
Come si può vedere se si desidera caricare il file font e il file background sarà necessario l’array NULL (Buffer font = load_png(PNG_FONT_PATH, NULL,NULL);).
PNG_FONT_PATH viene definito come il percorso di dev_usb000, insieme con BACKGROUND_FONT_PATH (load_png_bitmap(1, NULL,background, background_size);), questa volta const char e sull’uso di array NULL:
Codice
#define PNG_FONT_PATH "/dev_usb000/font.png" #define BACKGROUND_FONT_PATH "/dev_usb000/background.png"
Quando si carica background.png e font.png dalla memoria, scarica i dati da font.c e background.c con le dimensioni definite in fonts.h e backgrounds.h.
Codice
unsigned char background[61368] unsigned char font_array[14715] #define background_size 61368 #define font_array_size 14715
Questi invece sono modificati dal codice SRC originale:
Codice
[Spoiler title=”SRC Code”]
void init_graphic() { memset(&ctx, 0, sizeof(DrawCtx)); // alloc VSH Menu graphic buffers buf[0].addr = mem_alloc(MB(2)); // canvas buffer buf[1].addr = mem_alloc(MB(2)); // background buffer //Buffer font = load_png(PNG_FONT_PATH, NULL, NULL); // Load font.png from file Buffer font = load_png(NULL, font_array, font_array_size); // Load font.png from memory // set drawing context ctx.canvas = buf[0].addr; ctx.bg = buf[1].addr; ctx.font = font.addr; ctx.bg_color = 0xFF000000; // black, opaque ctx.fg_color = 0xFFFFFFFF; // white, opaque // get current display values offset = *(uint32_t*)0x60201104; // start offset of current framebuffer getDisplayPitch(&pitch, &unk1); // framebuffer pitch size h = getDisplayHeight(); // display height w = getDisplayWidth(); // display width // get x/y start coordinates for our canvas canvas_x = (w - CANVAS_W) / 2; canvas_y = (h - CANVAS_H) / 2; // dump background, for alpha blending dump_bg(); } int32_t load_png_bitmap(int32_t idx, const char *file, void *array, uint32_t array_size) { if(idx > PNG_MAX) return -1; if(file == NULL) ctx.png[idx] = load_png(NULL, array, array_size); else ctx.png[idx] = load_png(file, NULL, NULL); return 0; } Buffer load_png(const char *file, void *array, uint32_t array_size) { Buffer tmp; png_dec_info dec_ctx; // decryption handles void *buf_addr = NULL; // buffer for decoded png data // create png decoder create_decoder(&dec_ctx); // open png stream if(file == NULL) open_png(&dec_ctx, NULL, array, array_size); else open_png(&dec_ctx, file, NULL, NULL); // set decode parameter set_dec_param(&dec_ctx); // alloc target buffer buf_addr = mem_alloc(png_w * png_h * 4); // decode png stream, into target buffer decode_png_stream(&dec_ctx, buf_addr); // close png stream PngDecClose(dec_ctx.main_h, dec_ctx.sub_h); // destroy png decoder PngDecDestroy(dec_ctx.main_h); // store png values tmp.addr = (uint32_t*)buf_addr; tmp.w = png_w; tmp.h = png_h; return tmp; } static int32_t open_png(png_dec_info *dec_ctx, const char *file, void *array, uint32_t array_size) { uint32_t ret = 0; CellPngDecSrc src; CellPngDecOpnInfo info; if(file == NULL) { src.srcSelect = CELL_PNGDEC_BUFFER; src.fileName = NULL; src.fileOffset = NULL; src.fileSize = 0; src.streamPtr = array; src.streamSize = array_size; } else { src.srcSelect = CELL_PNGDEC_FILE; src.fileName = file; src.fileOffset = 0; src.fileSize = 0; src.streamPtr = NULL; src.streamSize = 0; } // spu thread disable src.spuThreadEnable = CELL_PNGDEC_SPU_THREAD_DISABLE; // open stream ret = PngDecOpen(dec_ctx->main_h, &dec_ctx->sub_h, &src, &info); return ret; }
[/spoiler]
.
CellPngDecSrc utilizza CELL_PNGDEC_BUFFER per la memoria e CELL_PNGDEC_FILE per i file, è necessario specificare lo stream e la dimensione per streamPtr e streamsize, e fileName deve essere un source [const char*file].
Di default mostra delle semplici opzioni (foto in alto) ma si possono modificare o aggiungerne di nuovi.
Menu
- Effettua un singolo bip.
- Effettua un doppio segnale acustico.
- Effettua un triplo bip.
- Effettua uno screenshot.
- Produce suono da snd_cursor.
- Produce suono da snd_system_ok.
- Produce suono da snd_system_ng.
- Produce suono da snd_trophy.
- Mostra messaggio nella XMB.
- Disattiva plugin.
- Resetta PS3.
- Spegni PS3.
Lo spegnimento della PS3 eliminerà la flag turnoff da /dev_hdd0/tmp/turnoff, la cancellazione eviterà l’arresto anomalo, questo è il codice utilizzato per eliminarlo:
Codice
static void delete_turnoff_flag(void) { cellFsUnlink((char*)"/dev_hdd0/tmp/turnoff"); }
Download: PS3 VSH Menu Optimized (POC by 3141card)
Non è possibile entrare nella recovery direttamente da questo menù?