Home Homebrew Rilasciato PS3 VSH Menu Optimized (POC by 3141card)

[Scena PS3] Rilasciato PS3 VSH Menu Optimized (POC by 3141card)

261
1

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.

a5ce94c727cbc5daf0ccc5946bfe9844

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.hbackgrounds.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)

1 commento

LASCIA UN COMMENTO

Per favore inserisci il tuo commento!
Per favore inserisci il tuo nome qui

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.