condorin escribió:no, estoy usando el puerto 0, el resto de los juegos funcionan igual que antes sin ningun cambio de cios
laranjito escribió:Hermes . ahora me dan "error fat fss" todos los .ciso al cargarlos por SD como el super mario galaxy 2 con el cios 222, con el 223 no da error.
Por DVD error -1 (cios 222), no carga
diff --git a/src/uloader/source/uloader.c b/src/uloader/source/uloader.c
index 7a977fe..e4ba3d2 100644
--- a/src/uloader/source/uloader.c
+++ b/src/uloader/source/uloader.c
@@ -2407,7 +2407,7 @@ char* disc_BannerTitle(u32 lba, SoundInfo *snd ){
init_ciso_table=1;
lba_start=lba;
- size = wbfs_extract_file2(fp, "opening.bnr", &banner, fun_fat_read);
+ size = wbfs_extract_file2(fp, "opening.bnr", &banner, __WBFS_ReadDVD);
if (!banner || size <= 0) goto error;
diff --git a/src/uloader/source/wbfs.h b/src/uloader/source/wbfs.h
index 8e52238..02033df 100644
--- a/src/uloader/source/wbfs.h
+++ b/src/uloader/source/wbfs.h
@@ -33,4 +33,6 @@ s32 disc_getdols(u8 *id);
char* WBFS_BannerTitle(u8 *discid, SoundInfo *snd);
+// Used to read the Banner of a Disc Title
+s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf);
#endif
diff --git a/src/uloader/source/wbfs.c b/src/uloader/source/wbfs.c
index 905e2e3..eba83b0 100644
--- a/src/uloader/source/wbfs.c
+++ b/src/uloader/source/wbfs.c
@@ -93,7 +93,7 @@ s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)
offset = ((u64)lba) << 2;
/* Calculate sizes */
- mod = ((u32) iobuf) & 31;
+ mod = ((u32) offset) & 31;
if (mod) { // Offset not aligned...
u32 left = ((0x20 - mod) < len) ? 0x20 - mod : len;
Spaceman Spiff escribió:Hermes, tanto tiempo. La verdad es que no he tenido mucho tiempo libre desde Enero hasta ahora, pero siempre me doy una vueltita por el Hilo para ver como andan las cosas.
Queria reportarte 2 problemas que he tenido, las 2 relacionadas con la carga de Backups desde la lectora de DVD (interna).
El primero es que no me dejaba cargar los juegos desde ahí, se colgaba con el titulo "Reading The Banner", revisando encontré que se estaba usando la función de carga desde FAT para leer el banner desde disco. Aqui esta el parche:
WDVD_UnencryptedRead(buffer, 0x40, offset - mod);
WDVD_UnencryptedRead(buffer, 0x40, offset - (u64) (mod - (mod & 3)));
memcpy(iobuf, buffer + mod+(mod & 3), left);
Hermes escribió:Otra cosa es que tu chip sea un tanto puñetero y te de problemas
El segundo parche no es correcto, puesto que hay que asegurar que el buffer está alineado a 32 bytes y tu estás alineando el offset...
/* Calculate offset */
offset = ((u64)lba) << 2;
/* Calculate sizes */
mod = ((u32) offset) & 31;
if (mod) { // Offset not aligned...
Spaceman Spiff escribió:
Hermes, mis problemas con mi chip (que definitivamente es puñetero!) no son con el iobuffer, sino con los offset no alineados. En caso de que le pase un offset que no sea multiplo de 32, utiliza el offset que le mande (offset & (~0x1F)), con lo que devuelve algo totalmente distinto a lo que se le pidio leer.
El iobuf siempre esta alineado, ya que los buffers que usas para hacer I/O sobre el disco siempre los adquiris con memallign, y si hay algun iobuf no alineado, corrigiendo el código fuente del uLoader se arregla. Los offsets no están precalculados y pueden que no siempre esten alineados.
Fijate en el comentario del código del parche que te mande (y que ya estaba desde antes), dice "Offset not aligned", que es la intención del código. Y por eso también se llama a la función WDVD_UnencryptedRead con el offset cambiado, para acomodar el offset para no tener problemas con los offsets que no estén alineados.
La alineación del iobuf no es lo que me esta importando en esa parte del código, afortunadamente están siempre alineados.
Wismaster escribió:Buenas, siempre hace falta tenerlo en la sd aunque lo tengas instalado como canal??
Un saludo
Spaceman Spiff escribió:Hermes escribió:Otra cosa es que tu chip sea un tanto puñetero y te de problemas
El segundo parche no es correcto, puesto que hay que asegurar que el buffer está alineado a 32 bytes y tu estás alineando el offset...
Hermes, mis problemas con mi chip (que definitivamente es puñetero!) no son con el iobuffer, sino con los offset no alineados. En caso de que le pase un offset que no sea multiplo de 32, utiliza el offset que le mande (offset & (~0x1F)), con lo que devuelve algo totalmente distinto a lo que se le pidio leer.
El iobuf siempre esta alineado, ya que los buffers que usas para hacer I/O sobre el disco siempre los adquiris con memallign, y si hay algun iobuf no alineado, corrigiendo el código fuente del uLoader se arregla. Los offsets no están precalculados y pueden que no siempre esten alineados./* Calculate offset */
offset = ((u64)lba) << 2;
/* Calculate sizes */
mod = ((u32) offset) & 31;
if (mod) { // Offset not aligned...
Fijate en el comentario del código del parche que te mande (y que ya estaba desde antes), dice "Offset not aligned", que es la intención del código. Y por eso también se llama a la función WDVD_UnencryptedRead con el offset cambiado, para acomodar el offset para no tener problemas con los offsets que no estén alineados.
La alineación del iobuf no es lo que me esta importando en esa parte del código, afortunadamente están siempre alineados.
Saludos
s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)
{
void *buffer = NULL;
u64 offset;
u32 mod, size;
s32 ret;
/* Calculate offset */
offset = ((u64)lba) << 2;
mod = ((u32) offset) & 31;
buffer=memalign(32, 32768+64);
if (!buffer)
return -1;
while(len>0)
{
size= (len>32768) ? 32768 : len;
if(size>mod) size-=mod;
/* Read data */
ret = WDVD_UnencryptedRead(buffer, (size+mod+31) & ~31, offset - mod);
if (ret < 0)
goto out;
/* Copy data */
memcpy(iobuf, buffer + mod, size);
iobuf+=size;
len-= size;
offset+= (u64) size;
mod=0;
}
/* Success */
ret = 0;
out:
/* Free memory */
if (buffer)
free(buffer);
return ret;
}
Tmv_Josue escribió:Wismaster escribió:Buenas, siempre hace falta tenerlo en la sd aunque lo tengas instalado como canal??
Un saludo
Te refieres a uLoader no es asi?, Pues depende de si quieras la version actual, ya que si haria falta tenerlo en la SD ya sea para lanzarlo por el HomeBrew Channel, o para que lo utilize un Canal ForWarder (Acceso Directo), en caso de que tu canal sea "Full" pues sería como si tuvieras 2, lo recomendable es un ForWarder que no dan tantos problemas .
Saludos
Hermes escribió:Spaceman Spiff escribió:Hermes escribió:
Si puedes, pruebame ésta rutina:s32 __WBFS_ReadDVD(void *fp, u32 lba, u32 len, void *iobuf)
{
void *buffer = NULL;
u64 offset;
u32 mod, size;
s32 ret;
/* Calculate offset */
offset = ((u64)lba) << 2;
mod = ((u32) offset) & 31;
buffer=memalign(32, 32768+64);
if (!buffer)
return -1;
while(len>0)
{
size= (len>32768) ? 32768 : len;
if(size>mod) size-=mod;
/* Read data */
ret = WDVD_UnencryptedRead(buffer, (size+mod+31) & ~31, offset - mod);
if (ret < 0)
goto out;
/* Copy data */
memcpy(iobuf, buffer + mod, size);
iobuf+=size;
len-= size;
offset+= (u64) size;
mod=0;
}
/* Success */
ret = 0;
out:
/* Free memory */
if (buffer)
free(buffer);
return ret;
}
Esta modificación está pensada para offset y memoria desalineada (que hay algún caso) y debería irte bien
xboxadicto escribió:tengo un problema, tengo una wii actualizada con el pimp my wii a 4.1E, decir ke antes de actualizar ya me pasaba , el caso es ke cuando meto un backup con neogama se me reinicia, bien me baje el uloader 5.0C, instale las cios con su instalador las 222 y las de arrbia ke creo ke son las 202, bien tengo las ios 38 rev 17 instaladas.
pues cuando meto un backup me sale dvd Error -1
alguna solucion??
gracias
Okis gracias, mas que nada es que me la a dejado un amigo y no tenia ninguna sd suya para poder dejarle el uloader, por eso lo keria instalar como canal.
Saludos
xboxadicto escribió:xboxadicto escribió:tengo un problema, tengo una wii actualizada con el pimp my wii a 4.1E, decir ke antes de actualizar ya me pasaba , el caso es ke cuando meto un backup con neogama se me reinicia, bien me baje el uloader 5.0C, instale las cios con su instalador las 222 y las de arrbia ke creo ke son las 202, bien tengo las ios 38 rev 17 instaladas.
pues cuando meto un backup me sale dvd Error -1
alguna solucion??
gracias
alguien puede a yudarme???
burton123 escribió:Saludos Hermes:
No se si colaboras con Wanin o no pero uno de los desarrolladores de otro Loader me pidio que te escribiera esto de su parte:
"If you have a direct line to Hermes, you might want to let him know that the in development rev20 already has a solution to the problem. From what giantpune has shown me, it seems Wanin is just blocking reads of the IOS modules from the games."
Esto a referente a juegos como POP.
Supongo que la razon del mensaje debe ser para que te informaras con wanin y facilitarte la tarea no se como lo veas.
rockbass2560 escribió:Me sorprende lo rapido que cambio de parecer...
Por otro lado, estáis comentando de que al parecer un juego, tiene una protección contra los cIOS ...
Vale ¿y que queréis que yo haga, majetes?
El que sepa en que consiste el problema, puede desarrollar un parche o proporcionar los datos a partir de los cuales se pueda encontrar una vía inteligente para evitar el problema (como pasó con lo del BCA) (es decir, me estoy comprometiendo a adoptar una medida vía Starlet si alguien me cuenta en que consiste el problema del chequeo)
Pero si estáis esperando a que yo vaya adquiriendo los juegos y saltando las protecciones que aparezcan, la llevais clara, porque ese no es mi terreno, ni yo dispongo de todos los juegos, ni tengo ganas de andar con ello. (es decir: hay gente que se piensa que yo tengo todos los juegos o que me dedico a desprotegerlos: esa no es mi función y por supuesto, no los tengo todos)
Si aparece una solución en otra parte, pues entonces se mirará de añadirla a uLoader, (como por ejemplo, los parches WIP que es algo que debí meter antes y además, debía una versión 5.0B) pero ahora mismo, no hace falta que recuerde otra vez que yo me considero retirado y el desarrollo de uLoader terminado (esto significa lo que significa: que solo si me sale del nabo o me apetece, por decirlo finamente, haré cosas, pero que la gente no debe esperar a que yo las haga y mucho menos exigirlas) y aunque es posible que corrija algunos bugs o añada cosas nuevas que vayan apareciendo, (version 5.0B en mente) no va a ser iniciativa mía buscar soluciones y en todo caso, si se me reportan datos concretos de lo que trata de detectar la protección, podría mirar si es posible engañar vía cIOS que es en lo único en lo que podría aportar soluciones (si son posibles), que no implicaran tener que crear una nueva versión de cIOS (lo cual, si es mi especialidad: a cada uno, lo suyo)
(traducido: si se cual es el problema porque otro lo ha contado y se puede arreglar utilizando el propio mload sin necesidad de sacar un nuevo cIOS, me estoy comprometiendo a intentar arreglarlo. ¿Sabes cuanto tardé en apañar una solución,una vez que supe que se detectaba dev/mload? )
Saludos
if(!cmp_string(name,"no_mload")) {flag_no_mload=1;return name;}
if(flag_no_mload && !cmp_string(name,"/dev/mload"))
{
return dev_kk;
}
Hermes escribió:Así que tengo la versión 5.0D a la espera cuya única novedad, es que funciona con el chip raro de éste colega
Pero vamos, lo de cambiar de parecer no he cambiado: sigo con la misma idea sobre el tema.
Saludos
josete2k escribió:Hermes escribió:Así que tengo la versión 5.0D a la espera cuya única novedad, es que funciona con el chip raro de éste colega
Pero vamos, lo de cambiar de parecer no he cambiado: sigo con la misma idea sobre el tema.
Saludos
Mira, igual me soluciona alguna de mis instalaciones también..... aunque últimamente uso WBFS_WIN he tenido que recurrir a instalar desde la consola y las instalaciones se colgaban en raras ocasiones.
Como siempre digo, maldito Hermes, siempre innnovando. (leer con voz de Homer J. Simpson)
kobe_bryant escribió:Hola a todos.
Al intentar actualizar uloader por red me da un error de update.txt. ¿Cómo puedo solucionar el error y actualizarlo?
Si no lo puedo solucionar, ¿en el enlace http://mods.elotrolado.net/~hermes/wii/ ... loader.dol está la última versión (5.0C o 5.0D)?
Gracias por la ayuda y un saludo a todos
josemurcia escribió:No puedo cargar el Bleach Versus Crusade, se me queda pillado al principio en la pantalla de NOW LOADING, alguna idea?
RyUk_YaGaMi escribió:josemurcia escribió:No puedo cargar el Bleach Versus Crusade, se me queda pillado al principio en la pantalla de NOW LOADING, alguna idea?
Ponle video en PAL50 y se soluciona Me pasaba tambien a mi.
1 saludo!
diff --git a/src/uloader/source/load_dol.c b/src/uloader/source/load_dol.c
index 80392c2..04dd157 100644
--- a/src/uloader/source/load_dol.c
+++ b/src/uloader/source/load_dol.c
@@ -38,6 +38,9 @@ typedef struct _dolheader {
void *dol_data=NULL;
int dol_len=0;
+extern u32 do_wip_code(void);
+extern void wipreset();
+extern void wipregisteroffset(u32 dst, u32 len);
extern void patch_dol(void *Address, int Section_Size, int sel);
@@ -97,6 +100,10 @@ int i;
dolheader *dol_header;
u32 current_addr=0;
+ wipreset();
+ wipregisteroffset((u32) dol_data, dol_len);
+ do_wip_code();
+
dol_header = (dolheader *) dol_data;
if(dol_header->bss_start)
diff --git a/src/uloader/source/loader.c b/src/uloader/source/loader.c
index f14735e..0ef09bd 100644
--- a/src/uloader/source/loader.c
+++ b/src/uloader/source/loader.c
@@ -537,8 +537,6 @@ const u8 newcode[] = "4E800020";
int is_channel_hook=0;
-u32 do_wip_code(void);
-
void patch_dol(void *Address, int Section_Size, int mode)
{
DCFlushRange(Address, Section_Size);
@@ -570,8 +568,6 @@ void patch_dol(void *Address, int Section_Size, int mode)
vidolpatcher(Address, Section_Size);
- do_wip_code();
-
/*HOOKS STUFF - FISHEARS*/
DCFlushRange(Address, Section_Size);
Spaceman Spiff escribió:Hermes, estuve revisando un poco el código que da soporte a los parches WIP.
Me parece que esta faltando un enganche, fijate que las rutinas wipreset y wipregisteroffset no son llamadas nunca en el código (o no supe encontrarlas) por lo tanto patchu8 esta utilizando valores no inicializados.
Aprovechando que todos los offset son relativos al archivo (y no a posiciones de memoria cuando el dol este cargado), agregué los llamados para parchar el dol justo antes de que las diferentes secciones sean cargadas en memoria.
No tengo ningún archivo WIP para probar en este momento, pero voy a ver si puedo generar uno y probar si esto esta funcionando correctamente, así puedo darte un parche definitivo.
Te adjunto las modificaciones que hice:diff --git a/src/uloader/source/load_dol.c b/src/uloader/source/load_dol.c
index 80392c2..04dd157 100644
--- a/src/uloader/source/load_dol.c
+++ b/src/uloader/source/load_dol.c
@@ -38,6 +38,9 @@ typedef struct _dolheader {
void *dol_data=NULL;
int dol_len=0;
+extern u32 do_wip_code(void);
+extern void wipreset();
+extern void wipregisteroffset(u32 dst, u32 len);
extern void patch_dol(void *Address, int Section_Size, int sel);
@@ -97,6 +100,10 @@ int i;
dolheader *dol_header;
u32 current_addr=0;
+ wipreset();
+ wipregisteroffset((u32) dol_data, dol_len);
+ do_wip_code();
+
dol_header = (dolheader *) dol_data;
if(dol_header->bss_start)
diff --git a/src/uloader/source/loader.c b/src/uloader/source/loader.c
index f14735e..0ef09bd 100644
--- a/src/uloader/source/loader.c
+++ b/src/uloader/source/loader.c
@@ -537,8 +537,6 @@ const u8 newcode[] = "4E800020";
int is_channel_hook=0;
-u32 do_wip_code(void);
-
void patch_dol(void *Address, int Section_Size, int mode)
{
DCFlushRange(Address, Section_Size);
@@ -570,8 +568,6 @@ void patch_dol(void *Address, int Section_Size, int mode)
vidolpatcher(Address, Section_Size);
- do_wip_code();
-
/*HOOKS STUFF - FISHEARS*/
DCFlushRange(Address, Section_Size);
Saludos
Hermes escribió:Pues no lo se, tío: yo he sacado esa parte del usbloader gx y lo único que cambia, es que en vez de llamar a esa rutina para todas las secciones, abriendo X veces el fichero y luego parcheando X veces, he partido la rutina en dos y solo se abre el fichero una vez y eso si, se hace el parche (teóricamente) X veces por cada sección.
Seguramente tengas razón (mañana le hecho un ojo en detalle), pero ya te digo que en el usbloader gx ninguna de esas dos funciones es llamada (o al menos yo no las veo al buscar la cadena)
Saludos
Spaceman Spiff escribió:Hermes escribió:Pues no lo se, tío: yo he sacado esa parte del usbloader gx y lo único que cambia, es que en vez de llamar a esa rutina para todas las secciones, abriendo X veces el fichero y luego parcheando X veces, he partido la rutina en dos y solo se abre el fichero una vez y eso si, se hace el parche (teóricamente) X veces por cada sección.
Seguramente tengas razón (mañana le hecho un ojo en detalle), pero ya te digo que en el usbloader gx ninguna de esas dos funciones es llamada (o al menos yo no las veo al buscar la cadena)
Saludos
Mire el código, ya que habías comentado que estaba basado en usbloader gx, que es el que se esta quejando la gente en gbatemp que no le anda el soporte de WIP. En los que dicen que anda bien es en NeoGamma y en el Cfg Loader.
Igualmente, Hermes, de ahí a que lo que yo haya hecho este del todo correcto es otro tema... Yo ya tengo un historial con uLoader
Spaceman Spiff escribió:
Mire el código, ya que habías comentado que estaba basado en usbloader gx, que es el que se esta quejando la gente en gbatemp que no le anda el soporte de WIP. En los que dicen que anda bien es en NeoGamma y en el Cfg Loader.
Igualmente, Hermes, de ahí a que lo que yo haya hecho este del todo correcto es otro tema... Yo ya tengo un historial con uLoader
josete2k escribió:Es que también te vas a mirar el mejor loader de todos.... a code dump no le gana nadie.
#include <gccore.h>
#include <string.h>
#include <stdlib.h>
u32 doltableoffset[64];
u32 doltablelength[64];
u32 doltableentries;
void wipreset()
{
doltableentries = 0;
}
void wipregisteroffset(u32 dst, u32 len)
{
doltableoffset[doltableentries] = dst;
doltablelength[doltableentries] = len;
doltableentries++;
}
void patchu8(u32 offset, u8 value)
{
u32 i = 0;
u32 tempoffset = 0;
while ((doltablelength[i] <= offset-tempoffset) && (i+1 < doltableentries))
{
tempoffset+=doltablelength[i];
i++;
}
if (offset-tempoffset < doltablelength[i])
{
*(u8 *)(offset-tempoffset+doltableoffset[i]) = value;
}
}
void wipparsebuffer(u8 *buffer, u32 length)
// The buffer needs a 0 at the end to properly terminate the string functions
{
u32 pos = 0;
u32 offset;
char buf[10];
while (pos < length)
{
if ( *(char *)(buffer + pos) != '#' && *(char *)(buffer + pos) != ';' && *(char *)(buffer + pos) != 10 && *(char *)(buffer + pos) != 13 && *(char *)(buffer + pos) != 32 && *(char *)(buffer + pos) != 0 )
{
memcpy(buf, (char *)(buffer + pos), 8);
buf[8] = 0;
offset = strtol(buf,NULL,16);
pos += (u32)strchr((char *)(buffer + pos), 32)-(u32)(buffer + pos) + 1;
pos += (u32)strchr((char *)(buffer + pos), 32)-(u32)(buffer + pos) + 1;
while (pos < length && *(char *)(buffer + pos) != 10 && *(char *)(buffer + pos) != 13 && *(char *)(buffer + pos) != 0)
{
memcpy(buf, (char *)(buffer + pos), 2);
buf[2] = 0;
patchu8(offset, strtol(buf,NULL,16));
offset++;
pos +=2;
}
}
if (strchr((char *)(buffer + pos), 10) == NULL)
{
return;
} else
{
pos += (u32)strchr((char *)(buffer + pos), 10)-(u32)(buffer + pos) + 1;
}
}
}