DESAFIO DAXHORDES V2

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, dark_sasuke, m0skit0, LnD, ka69, zacky06

Responder
Avatar de Usuario
Darthvader38
Enteradillo
Enteradillo
Mensajes: 67
Registrado: 24 Ene 2010, 06:39

DESAFIO DAXHORDES V2

Mensaje por Darthvader38 »

Hola colegas de DaxHordes he estado un poco fuera de la web
pero no de la programacion y como siempre me surgen nuevas cosas que
preguntar, he aqui mi nuevo Kit de dudas, haber como me ayudan esta
vez, que pueden ser tambien las dudas de muchos y las futuras de otros.Saludos a todos!!!!
En especial a Alek por sus tutos que tanto me han ayudado, a M0skit0 que aunque un poco regañon
con lo de las Flash siempre esta por aqui pa' responder!!! y a Soulless que tambien me ha ayudado en temas
mas especificos.


=================
Lo hare por tema:


====>Modulos:
1-Tengo problemas con averiguar la lista de modulos que estan ejecutandose en la PSP. y las funciones
que me sugirieron anteriormente como la tal "getModuleList" (en abreviatura que no me la recuerdo entera)
no me funciono.Podrian decirme especificaciones para su funcionamiento?Kernel?VSH?USERMODE?que sucede
que he probado de mil maneras y no me funciona? La ideas es si alguien tiene un codigo funcional que
pueda exponer....algo simple pero funcional, pues dicen y dicen pero les aseguro que falta algo.
Un ejemplo porfa!

2-Las direcciones de memoria asignado para cada modulo es lineal?
A ver si me explico mejor...el sistema asigna de la 0x01 a 0x10 (hipoteticamente,
que vamos esto es muy poco en realidad!!!) para el modulo "Modulo_ejemplo"? o
asigna en trozos? es decir...un poco desde la 0x01 a 0x03 y otro poco de 0x55 a 0x62 para "Modulo_ejemplo"?

3-Si la direccion (ejemplo) 0x10 tenia un valor almacenado (4) y cambio a (5)
como puedo saber que modulo fue el que modifico el valor?

4-Como puedo saber a que modulo pertenece la direccion (ejemplo) 0x10.

5-Esto no es precisamente una duda pero la mejor seccion para exponerlo es aqui supongo.
He observado una anomalia al usar la funcion sceKernelFindModuleByName
ya que ella devuelve un struct SceModule, pues en esta struct es donde esta lo
que yo observo como un error.El valor del parametro text_addr en realidad esta
contenido en text_size y asi consecutivamente esta corridos todos los valores causando
que el valor real que deberia indicar cada parametro esta contenido realmente en el siguiente,
esto sucede desde un paramtero en adelante (creo que entry_addr o desde donde comienzan los tipos
"unsigned int" en el struct,ver PSPSDK API)no he investigado ha
profundidad ya que solo obtuve los datos que necesitaba y segui con mi proyecto, pero
lo señalo para ahorrarle un dolor de cabeza a otros novatos como yo y talvez un poco
de tiempo tambien(que yo me hale los pelos por un buen rato), me di cuenta de la
incoherencia gracias al PSPLINK(grandiosa aplicacion porcierto), talvez esto es muy viejo y
hasta halla una correpcion pero yo no me entere asi que lo difundo aqui! Corrovoren esto porfavor!!
No quiero causar ningun estrago por mi ignorancia).

6-Tengo entendido que las funciones :

sceKernelLoadModule
sceKernelStartModule

sirven para ejecutar un modulo como su nombre lo indica, he observado que solo pueden cargar
modulos (ELF) y no los que tienen cabezera (~PSP) alguien tiene una respuesta concreta de
porque no los carga? Es porque los (~PSP) son de Sony y estos piden algo especial para su ejecucion?
talvez una firma digital o algo asi? disculpen mi ignorancia nuevamente pero por preguntar y plantear
hipotesis es por donde he aprendido que se comienza...

7-En la documentacion del SDK segun lo que he entendido (como esta en ingles no estoy seguro de mi interpretacion)
que para cargar un modulo desde un buffer de memoria requiere que esta sea multiplo de 64...es esto cierto?
o es mala interpretacion mia? y si no que es lo que queria decir con multiplo de 64??

8-Hay mas funciones ademas de las enumeradas encima que me puedan citar para cargar modulos?
que diferencias tienen a las funciones que cito encima?Una de esas funcines podria ser
la "Loadexec" o algo por el estilo? cuales mas hay? quien sabe algo acerca de esto?
Conocen alguna forma de poder cargar exitosamente los modulos con cabezera (~PSP)?

9-Hay alguna manera de averiguar talvez hasta en tiempo de ejecucion las funciones que brindan los modulos
del sistema?

====>Memoria:
10-Alguien conoce en que memoria esta alojado el buffer que almacena las teclas
que son presionadas en la PSP?.Para ser mas preciso....el buffer esta almacenado
en algun registro del procesador? o talvez en alguna region de la RAM reservada para
este tipo de cosas....o talvez dentro de un modulo? Donde? Donde?

11- Llevo mas de un año vinculado con la programacion de homebrew
para PSP y haciendo preguntas por este foro....y posiblemente por no
saber un ingles "solido" he estado privado de muchas explicaciones en documentacion
que estan por la web...a estas alturas no he encontrado una explicacion
en español de una de las lineas comunes que uso en mi codigo generalmente:

PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
y
PSP_MAIN_THREAD_ATTR(0);
que es realmente esto?
Me da la idea de que la primera y la segunda linea proporcionan accesos
diferentes a la memoria de la PSP.Es decir puedo usar funciones del sistema
diferentes por consecuencia de la region de la memoria donde estan alojadas
dichas funciones.Es eso cierto?

y tambien tengo fuertes duda sobre:

PSP_MODULE_INFO("MODULO", 0, 1, 1);

en el manual de Alek dice que es el "modo de compilacion" ==>que significa esto?
A mi entender en el ejemplo que puse esta compilando en
"vsh" quiere decir esto que solo se ejecutara desde el XMB?
o existe una region de la memoria de la PSP llamada asi talvez?

Cada vez que creo un homebrew y usa una u otras funciones,...etc, referente a este aspecto
que cito en esta pregunta, voy probando hasta que finalmente me compila y ejecuta bien,
es como si fuera un ciego esperando tocar el boton correcto, cada vez me ocupo de problemas
mas serios referente al desarrollo de homebrew y voy ganando conocimiento del sistema y su
funcionamiento... pero esta duda es "el perro que siempre me muerde"

====>Programacion hardware:
12- Ya ni recuerdo donde, pero creo que fue en la
documentacion de algun homebrew que lei que usaba: El Wifi a 333 MHz.
Segun me parecio el documento se referia al Wifi en si y no a elevar el
reloj de la CPU...es esto cierto? se puede usar el Wifi en ese modo?
La ganancia a mi parecer es en la velocidad de trasmicion de datos.
Confirmenme...es esto asi? aumenta la velocidad de transmicion de datos?
Y... afectaria esto la distancia que alcanza la señal?
El homebrew AdhocFileTransfer posee la velocidad mas alta de transferencia de
datos que he visto en un homebrew de PSP, (yo mismo he hecho homebrews wifi
pero ni se acercan a este en velocidad de transferencia). Puede ser que
el AdhocFileTransfer se valga de el mito o realidad de poner el wifi a 333MHz?
O talvez es por el buen curro de sincronizacion entre emisor-receptor?.
Conocen acaso alguna funcion para lograr elevar la velocidad del wifi?
Hay alguna manera mediante software que pueda lograr mayores distancias de envio aunque
cueste en velocidad?Puesto que he leido en la Wiki "A mayor frecuencia menor alcance"
y no me quedo claro si se refiere a los 2.4 GHz o al clock del dispositivo...como ponerlo a 333MHZ...

13-La bateria de la PSP posee 3 "pines" o "contactos", es alguno de estos el que envia la informacion de estado?
Cosas asi como los mAh que le quedan, la Temperatura, el ID, y otros...
Que pasa si este "pin" o "contacto" no estuviera? la PSP podria encenderse y funcionar el sistema?
El hombrew creo que bien conocido por el nombre de Xplora...accede a informacion que no habia
visto ni en ejemplos del SDK, la web, etc, esta informacion es precisamente los mAh que posee la bateria y
creo que hasta su capacidad maxima tambien la muestra...que funciones logran esto? porque no las
he visto en ningun lado....saben sus nombres ,librerias o algo de ellas?

====>Otros:
14-Acerca de las interrupciones:
Son secciones que establece el sistema para el funcionamiento
de otros hilos de ejcucion ademas del principal que podria ser un homebrew, o juego?
Estas secciones tienen un principio y fin basadas en un tiempo preestablecido o
dependen de algo mas...?
Hace tiempo que no uso detener interrupciones...(y no las volvere a usar hasta que tenga una
idea solida de su utilidad)pero me parece que si no las
reestablezco la PSP se bloquea...es asi? por que?

15-Exepciones:
Que son?
Que utilidades tienen?
Me parece que se refieren a errores es cierto?
Tambien creo que tienen vinculos con los registros del procesador es cierto,
se almacenan en estos?

16-Ficheros:
La manera de saber si un fichero esta siendo usado es accediendo a informacion
del estado? Hay alguna otra manera de averiguarlo?
M0skit0 una vez se refirio a algo como "engancha la funcion sceIoOpen" para saber
todos los ficheros que son usados por el sistema. Como hago esto?Me imagino
que es usando punteros pero que hago? alguien sabe algo al respecto o talvez el
mismo m0skit0 pueda dar respuesta a esto?

17-Que hace esta funcion?:

sceIoDevCtl

dice que envia y recibe comandos a dispositivos..pero a que se refiere con dispositivos!?
En los ejemplos veo que se usa para obetener la capacidad de la MS asi como el
espacio libre..... es la MS(Memory Stick) un dispositivo?
alguien puede decirme que mas cabe en esta clasificacion o nombre de "dispositivos".
Y sobre estos comandos? hay alguna lista que detalle los posibles segun el
dispositivo al que son orientados? pregunto esto porque de algun lado sacaron el
tipico que veo que todo el mundo usa "0x02425818".Donde esta la lista
de estos comandos!!!??? es una de las funciones que mas me intriga puesto
que me da la idea de que tiene muchas otras utilidades que brindar...
me parecio leer en algun lado que esta o una de nombre muy parecido a esta habilitaba
el acceso a la Flash internas....es cierto?saben el comando?? donde puedo obtenerlos?
y que diferencia tendria con el viejo "sceIoAssign"??? porfa...que esta vez no se
me queden cortos de explicacion con esta duda que siempre donde la coloco se me
quedan como en el limbo...
Debido a la forma de interpretacion de la informacion despues de usar el comando "0x02425818"
en el ejemplo que vi... ni me atrevo a usarla puesto que estoy seguro que si no hay una
lista o algun tipo de documentacion sobre esto...estare perdiendo mi tiempo...
Alguien conoce mas comandos aparte de este??? porque he buscado en muchos SRC y el unico
que usan es este.


18-MS (Memory Stick):
Hay alguna manera conocida o funcion que permita utilizar la Memory Stick
a manera de bloques ignorando el sistema de archivos asi como lo hace
la libreria de funciones Nand....digo estoy casi seguro que la hay...pero alguien aqui conoce como?

19-El sistema de la PSP formatea la MS y al parecer trata de aprovechar todo el
espacio que pueda ademas del sistema de archivos y lo pone a disposicion del usuario...
Luego vi el formateo del despertar y vi que formateaba las flash internas y te permitia
seleccionar que espacio formatear....asi que la pregunta es si conocen que funcion
usa el sistema...o el despertar? o si sabe de otra forma que pueda formatear la MS y que me permita
establecer el espacio para formateo...no es que quiera conseguir mas...eso es de tontos a estas alturas...
pero tengo un par de usos y me seria util si alguien pudiera citar alguna funcion de formateo
que por parametros o algo me permita establecer el espacio a usar.
Creo que el despertar importa esta funcion de prx del sistema...alguien puede
corrovorar esto?

20-PRXTool.
En todos lados dice que para su instalacion despues de descargar determinados archivos
recurriran a los siguientes comandos:

Codigo:

svn co svn://svn.ps2dev.org/psp/trunk/prxtool
cd prxtool
./bootstrap
./configure
make
make install


Pero donde pongo esto?!?!?!?!
En ningun lugar lo dicen!!!! y de veras me interasa
esta herramienta...pero va por el mismo camino y trabajo que me costo
conseguir el PSPLINK...
Que hago lo pongo dentro de que fichero?
como uso estos comandos si ni se que tengo que abrir o donde
tengo que alojarlos....

21-Ultimamente he observado plugins que detienen la ejecucion de lo juegos por ejemplo
para desplegar sus menus y demas opciones....como lo hacen?
manejando interrupciones?,
manjenado los thread's que esta ejecutando la PSP talvez?
porque es como si pusiera en pausa todo y ellos continuaran funcionando....

22-Como puedo saber a que modulo pertenece determinado hilo de ejecucion?



SALUDOSS!!!

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: DESAFIO DAXHORDES V2

Mensaje por m0skit0 »

Vaya post, hijo... :tiro: Te respondo aunque me llames regañón, pero ve preparando una invitación a un restaurante de lujo :lol:

Darthvader38 escribió:Tengo problemas con averiguar la lista de modulos que estan ejecutandose en la PSP. y las funciones que me sugirieron anteriormente como la tal "getModuleList" (en abreviatura que no me la recuerdo entera) no me funciono.

Esto juraría que lo has preguntado mínimo dos veces anteriormente. La función de la que hablas es

Código: Seleccionar todo

int sceKernelGetModuleIdList(SceUID *readbuf, int readbufsize, int *idcount)

para obtener la lista de los módulos, y luego necesitas

Código: Seleccionar todo

int sceKernelQueryModuleInfo(SceUID modid, SceKernelModuleInfo *info)

para obtener la información de un módulo en concreto.

Funciona tanto en modo usuario como kernel (VSH es modo usuario, sólo que con algunos permisos extra). Te aseguro que funcionan bien, ya que las he usado varias veces. Si posteas cómo usas las funciones, te puedo indicar en qué te estás equivocando.

Darthvader38 escribió:2-Las direcciones de memoria asignado para cada modulo es lineal?

Depende de los segmentos que tenga el módulo. Para cada segmento del módulo se reserva un espacio lineal. Un módulo no suele tener más de 2 segmentos (código y datos).

Darthvader38 escribió:3-Si la direccion (ejemplo) 0x10 tenia un valor almacenado (4) y cambio a (5)
como puedo saber que modulo fue el que modifico el valor?

Usando los registros WATCH de debugging. Estos registros te permiten especificar una dirección de memoria y la CPU lanza una excepcion cada vez que se accede a dicha dirección. Nunca lo he usado, pero existe. Igualmente una dirección de memoria es para un solo módulo, por tanto con que sepas a qué módulo pertenece esa dirección, lo más probable es que sea dicho módulo el que modifique esa dirección.

Darthvader38 escribió:4-Como puedo saber a que modulo pertenece la direccion (ejemplo) 0x10.

Esto ya te lo he respondido varias veces también. modinfo en psplink o usando las funciones de tu primera pregunta. No tienes más remedio que recorrer todos los módulos y mirar sus direcciones.

Darthvader38 escribió:en esta struct es donde esta lo que yo observo como un error

Esto ya lo comentamos en otras discusiones, y sí, tienes razón. Esto se debe a que Sony cambió estas estructuras internamente a partir de cierto FW (creo que el 4.XX). No hay nada que se pueda hacer salvo cambiar el struct en sí dentro del PSPSDK.

Darthvader38 escribió:he observado que solo pueden cargar modulos (ELF) y no los que tienen cabezera (~PSP)

Hm, creo que sí puedes cargar ambos, ya que el FW usa esas funciones para cargar esos módulos. A lo mejor tu problema radica en que no puedes cargarlos debido a dónde se encuentran ubicados.

Darthvader38 escribió:Es porque los (~PSP) son de Sony

No son de Sony. Si te fijas los módulos de CFW también son ~PSP. Eso simplemente indica que el módulo está comprimido y/o cifrado. En el caso de homebrew con ~PSP, es que está comprimido (pero no cifrado).

Darthvader38 escribió:para cargar un modulo desde un buffer de memoria requiere que esta sea multiplo de 64...es esto cierto?

Supongo que te refieres a sceKernelLoadModuleBuffer. Si es así, efectivamente en la documentación pone: the buffer must reside at an address that is a multiple to 64 bytes. Lo has entendido bien: el buffer debe comenzar en una dirección múltiplo de 64. Ojo que está función es sólo kernel.

Darthvader38 escribió:Hay mas funciones ademas de las enumeradas encima que me puedan citar para cargar modulos?

Modo usuario: http://psp.jim.sh/pspsdk-doc/group__ModuleMgr.html
Modo kernel: http://psp.jim.sh/pspsdk-doc/group__ModuleMgrKern.html

Darthvader38 escribió:Hay alguna manera de averiguar talvez hasta en tiempo de ejecucion las funciones que brindan los modulos del sistema?

Eso se llaman exportaciones (exports). Se pueden averiguar tanto en ejecución (parseando la sección de exportes del módulo) como usando prxtool sobre los módulos.

Darthvader38 escribió:Alguien conoce en que memoria esta alojado el buffer que almacena las teclas
que son presionadas en la PSP?

Esa dirección debe variar con el FW. Es obvio que está en el PRX que controla las teclas (ahora no recuerdo el nombre concreto).

Darthvader38 escribió:PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
y
PSP_MAIN_THREAD_ATTR(0);
que es realmente esto?

Los permisos del hilo principal del homebrew. Ten en cuenta que el PSPSDK crea automáticamente un hilo principal para tu homebrew y lo lanza con main como función principal. En realidad el punto de entrada de los módulos es module_start, que es creada por PSPSDK, y que lanza el main de tu homebrew. Míralo en el código del PSPSDK para saber cómo lo hace concretamente. También puedes obligar al PSPSDK a usar tu propia module_start.

Darthvader38 escribió:PSP_MODULE_INFO("MODULO", 0, 1, 1);

Esto es la información que va incluída en la cabecera del módulo, e indica al firmware información sobre el módulo: nombre, modo (kernel, VSH, usuario, y un porrón más que desconozco), versión alta y versión baja del módulo.

Darthvader38 escribió:Segun me parecio el documento se referia al Wifi en si y no a elevar el reloj de la CPU...es esto cierto?

No, se refieren a la velocidad de la CPU.

Darthvader38 escribió:Conocen acaso alguna funcion para lograr elevar la velocidad del wifi?

No puedes. La velocidad de transmisión es fija y está definida en el protocolo IEEE 802.11. Hay varios sub-protocolos, y cada tarjeta soporta unos u otros.

Darthvader38 escribió:Hay alguna manera mediante software que pueda lograr mayores distancias de envio aunque cueste en velocidad?

La respuesta es la misma que la anterior.

Darthvader38 escribió:Acerca de las interrupciones

Las interrupciones es un mecanismo asíncrono (pueden ocurrir en cualquier momento) que sirven para avisar a la CPU de cierto evento. En MIPS se tratan igual que las excepciones. Generalmente las interrupciones se usan para indicar que se ha completado una tarea de lectura/escritura por el hardware. Al ocurrir esto, el kernel atrapa la interrupción y ejecuta el código correspondiente a dicha interrupción (igual que hace con cualquier otra excepción). Al terminar, devuelve el control al estado previo. Desactivar las interrupciones sólo se da en casos excepcionales en los que no queremos que un trozo de código sea interrumpido porque eso haría que funcione mal. Se debe usar en cachos de código muy cortos, cuanto más cortos mejor, ya que todas las interrupciones que lleguen mientras estén desactivadas se pierden, con la consiguiente pérdida de datos. Obviamente desactivar las interrupciones permanentemente hará que la CPU sólo ejecute el código que está corriendo, ignorando totalmene cualquier información proviniente del hardware, y por tanto cualquier comunicación con el usuario.

Darthvader38 escribió:Exepciones: Que son?

Como su nombre indica, es un mecanismo para controlar cambios no esperados en el flujo de ejecución. Por ejemplo, errores aritméticos (dividir por cero), interrupciones (como he comentado anteriormente), etc... En MIPS las llamadas al sistem, la instrucción SYSCALL, también son excepciones, al igual que las instrucciones de depurado como BREAK.

Darthvader38 escribió:Que utilidades tienen?

Te he comentado por encima antes. Para más detalles, consulta el manual de programación de MIPS, es gratis y lo puedes bajar de la red.

Darthvader38 escribió:Tambien creo que tienen vinculos con los registros del procesador es cierto, se almacenan en estos?

¿Hay algo que no tenga vínculos con registros del procesador? :mrgreen:

Darthvader38 escribió:La manera de saber si un fichero esta siendo usado es accediendo a informacion
del estado? Hay alguna otra manera de averiguarlo?

El kernel mantiene una tabla de descriptores de ficheros abiertos. Otra cosa es dónde se almacena dicha tabla :lol:

Darthvader38 escribió:M0skit0 una vez se refirio a algo como "engancha la funcion sceIoOpen" para saber
todos los ficheros que son usados por el sistema.

Esto sólo es posible si parcheas sceIoOpen en modo kernel. Desde modo usuario sólo puedes enganchar el stub de los módulos y por tanto sólo puedes averiguar qué ficheros abren esos módulos.

Darthvader38 escribió:Como hago esto?Me imagino que es usando punteros pero que hago?

Depende de si quieres enganchar sceIoOpen globalmente o sólo para un módulo en concreto. Globalmente es más complicado porque tendrías que parchear la misma sceIoOpen, mientras que para un módulo simplemente enganchas el stub de sceIoOpen y lo rediriges a tu función (ojo con los modos).

Darthvader38 escribió:ue hace esta funcion?: sceIoDevCtl dice que envia y recibe comandos a dispositivos..pero a que se refiere con dispositivos!?

Con dispositivos se refiere al hardware, obviamente. Manda comandos al hardware de almacenamiento de datos, como configuración, modos, etc...

Darthvader38 escribió:regunto esto porque de algun lado sacaron el tipico que veo que todo el mundo usa "0x02425818".Donde esta la lista de estos comandos!!!???

En ningún sitio, desgraciadamente. No está documentado.

Darthvader38 escribió:me parecio leer en algun lado que esta o una de nombre muy parecido a esta habilitaba el acceso a la Flash internas....es cierto?

Cierto, ya que la flash es un dispositivo de almacenamiento.

Darthvader38 escribió:Hay alguna manera conocida o funcion que permita utilizar la Memory Stick
a manera de bloques ignorando el sistema de archivos

Esto sólo lo puedes hacer desde modo kernel accediendo a los registros de la NAND. También puedes usar el directamente el driver de MS (ahora no recuerdo el nombre del PRX en concreto).

Darthvader38 escribió:19

fatms.prx. No sé cómo lo hará el DC, pero el driver FAT para MS está en ese módulo, así que supongo que para la flash habrá otro parecido.

Darthvader38 escribió:20-PRXTool.
En todos lados dice que para su instalacion despues de descargar determinados archivos
recurriran a los siguientes comandos:
Pero donde pongo esto?!?!?!?!
En ningun lugar lo dicen!!!!

Pues en el directorio donde te lo quieres bajar, hombre... :roll: Hay que usar más Linux y dejar Windows, que sólo atonta :tongue:

Darthvader38 escribió:21-Ultimamente he observado plugins que detienen la ejecucion de lo juegos por ejemplo para desplegar sus menus y demas opciones....como lo hacen?

Se puede hacer de varias maneras, pero la más correcta en mi opinión es deteniendo los hilos del juego.

Darthvader38 escribió:22-Como puedo saber a que modulo pertenece determinado hilo de ejecucion?

thlist y thinfo (o un comando parecido desde PSPLINK)
Imagen

Avatar de Usuario
Darthvader38
Enteradillo
Enteradillo
Mensajes: 67
Registrado: 24 Ene 2010, 06:39

Re: DESAFIO DAXHORDES V2

Mensaje por Darthvader38 »

Que bien! has respondido!!! aun despues de ese triste anuncio sobre ti y tu retirada!! que bad! malo malo.... :(
Oye ahora reviso todo!!!! muchas gracias que a probar voy ...todo!!!!
:oki: :oki: :oki: :oki: :oki: :oki: :oki: :oki: :oki: Eres lo mas....

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: DESAFIO DAXHORDES V2

Mensaje por m0skit0 »

La retirada es del desarrollo. Ayudar a los compañeros desarrolladores siempre es de recibo.
Imagen

Responder