¿Quieres programar XeX?

Pues si, ya he visto varios devs en foros extranjeros pidiendo lo mismo, a ver si se puede usar las retail como debugger para emular y depurar codigo, sin necesidad de estar compilandolo cada vez, en teoria bastaria con conectar la x360 por USB y sincronizar con ella, pero no se si el Kernel esta lo suficientemente desprotegido para poder hace esto.
ahmmm ahorita viendo el contenido del SDK esta un programa que se llama "xbwatson" y te pide el IP de la consola o el Nombre de la misma, no se exactamente para que funcione, voi a empezar a echar un ojo y tratar de resolver algo :)

salu2
Podeis echarle un vistazo a la comuniidad oficial de desarrollo de XNA.

http://creators.xna.com/es-ES

Hay tutoriales y codigo de ejemplo.

Lo que nose es si es lo mismo programar con XNA que con el SDK, ¿alguien que controle mas nos lo puede resolver?

Saludos.
no es lo mismo, son codigos diferentes
JohnCrichton escribió:no es lo mismo, son codigos diferentes


Ok, entonces las librerias del XNA son diferentes a las del SDK?
nadie ha encontrado aun algunos sources de ejemplo y demas?
Hay que ir a la vieja usanza, con printfs, es bastante coñazo, pero mientras se consigue algo, es la mejor opción. A mi también me gustaría ver códigos de ejemplo... Por mi parte estoy bajando la última versión del SDK a ver que tal :P

Saludos.
bpSz escribió:Hay que ir a la vieja usanza, con printfs, es bastante coñazo, pero mientras se consigue algo, es la mejor opción. A mi también me gustaría ver códigos de ejemplo... Por mi parte estoy bajando la última versión del SDK a ver que tal :P

Saludos.


En el sdk hay bastantes ejemplos para empezar a programar ya en direct3d y demás. Son solo compilar y ejecutarlos en la xbox para comprobarlos. Antes hay que desprotejer los xex de la forma habitual
esvenco escribió:
bpSz escribió:Hay que ir a la vieja usanza, con printfs, es bastante coñazo, pero mientras se consigue algo, es la mejor opción. A mi también me gustaría ver códigos de ejemplo... Por mi parte estoy bajando la última versión del SDK a ver que tal :P

Saludos.


En el sdk hay bastantes ejemplos para empezar a programar ya en direct3d y demás. Son solo compilar y ejecutarlos en la xbox para comprobarlos. Antes hay que desprotejer los xex de la forma habitual


Por curiosidad, podrias decirnos donde estan esos ejemplos?

Me refiero al directorio, es que soy nuevo en esto y no los encuentro.

Saludos.
SPlNeTe escribió:
esvenco escribió:
bpSz escribió:Hay que ir a la vieja usanza, con printfs, es bastante coñazo, pero mientras se consigue algo, es la mejor opción. A mi también me gustaría ver códigos de ejemplo... Por mi parte estoy bajando la última versión del SDK a ver que tal :P

Saludos.


En el sdk hay bastantes ejemplos para empezar a programar ya en direct3d y demás. Son solo compilar y ejecutarlos en la xbox para comprobarlos. Antes hay que desprotejer los xex de la forma habitual


Por curiosidad, podrias decirnos donde estan esos ejemplos?

Me refiero al directorio, es que soy nuevo en esto y no los encuentro.

Saludos.

Explorador de ejemplos
C:\Archivos de programa\Microsoft Xbox 360 SDK\Source\Tools\SampleBrowser\SampleBrowser.exe

Carpeta de ejemplos
C:\Archivos de programa\Microsoft Xbox 360 SDK\Source\Samples
El problema es que al instalar el SDK me pide el Visual Studio 2005 SP1 para poder instalar los ejemplos y yo tenia instalado la vesion 2008.

Gracias.
yo estoy igual, no me deja hacer la Full Install, uso VS 2008... y ni si quiera se como compilar un xex, como incluir las libs... menudo desastre. Solo he usado el DJGPP y el DevCpp a lo largo de mi vida, jamas me apetecio tocar el visual studio.

Estaria bien encontrar algun template de esos, que te pone la abse del codigo, los includes, el main(), y poco mas.
Ya solucione el problema instalando el Visual Studio 2005 y el SP1. Hay bastantes ejemplos para probar, aunque lo suyo seria poder convertir nuestras consolas retail en dev para poder debugar el codigo de forma sencilla y no tener que estar compilando y pasadolo con un pendrive.

¿Por cierto alguno conoce la rutina para lanzar un xex?

Saludos.
SPlNeTe escribió:Ya solucione el problema instalando el Visual Studio 2005 y el SP1. Hay bastantes ejemplos para probar, aunque lo suyo seria poder convertir nuestras consolas retail en dev para poder debugar el codigo de forma sencilla y no tener que estar compilando y pasadolo con un pendrive.

¿Por cierto alguno conoce la rutina para lanzar un xex?

Saludos.


¿En teoría no mandan las consolas con rebooter un log por el puerto lpt? quizá esa información os valga como debug...

En cuanto a transformar una retail en debug, es posible, pero no creo que liberen la forma por que ahí si que microsoft se enfadaría muchiiiiiiisimo. No conteis con ello :).
SPlNeTe escribió:¿Por cierto alguno conoce la rutina para lanzar un xex?


Te pego el código que posteó Ski-lleR y que es lo único que necesitas para hacer un loader:

/*
   
    List of physical drive
   
    "\\Device\\Flash"
    "\\Device\\Mu1"
    "\\Device\\Mu0"
    "\\Device\\Cdrom0"
    "\\Device\\Harddisk0\\Partition0"
    "\\Device\\Harddisk0\\Partition1"
    "\\Device\\Harddisk0\\Partition2"
    "\\Device\\Harddisk0\\Partition3"
    "\\Device\\Mass0"
    "\\Device\\Mass1"
    "\\Device\\Mass2"
   
    */
   
    #define DEVICE_NAND_FLASH 0
    #define DEVICE_MEMORY_UNIT0 1
    #define DEVICE_MEMORY_UNIT1 2
    #define DEVICE_CDROM0 3
    #define DEVICE_HARDISK0_PART0 4
    #define DEVICE_HARDISK0_PART1 5
    #define DEVICE_HARDISK0_PART2 6
    #define DEVICE_HARDISK0_PART3 7
    #define DEVICE_USB0 8
    #define DEVICE_USB1 9
    #define DEVICE_USB2 10
   
    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
   
    // Follow the white rabbit ^^
    extern "C" int __stdcall ObCreateSymbolicLink( STRING*, STRING*);
    extern "C" int __stdcall ObDeleteSymbolicLink( STRING* );
   
    void Monter( int periphPhys, char* lettreLecteur )
     {
         char lecteurCible[16];
         sprintf_s( lecteurCible,"\\??\\%s", lettreLecteur );
   
         char * periphOriginal;
         switch( periphPhys )
         {
         case DEVICE_NAND_FLASH:
             periphOriginal = "\\Device\\Flash";
         break;
         case DEVICE_MEMORY_UNIT0:
             periphOriginal = "\\Device\\Mu0";
         break;
         case DEVICE_MEMORY_UNIT1:
             periphOriginal = "\\Device\\Mu1";
         break;
         case DEVICE_CDROM0:
             periphOriginal = "\\Device\\Cdrom0";
         break;
         case DEVICE_HARDISK0_PART0:
             periphOriginal = "\\Device\\Harddisk0\\Partition0";
         break;
         case DEVICE_HARDISK0_PART1:
             periphOriginal = "\\Device\\Harddisk0\\Partition1";
         break;
         case DEVICE_HARDISK0_PART2:
             periphOriginal = "\\Device\\Harddisk0\\Partition2";
         break;
         case DEVICE_HARDISK0_PART3:
             periphOriginal = "\\Device\\Harddisk0\\Partition3";
         break;
         case DEVICE_USB0:
             periphOriginal = "\\Device\\Mass0";
         break;
         case DEVICE_USB1:
             periphOriginal = "\\Device\\Mass1";
         break;
         case DEVICE_USB2:
             periphOriginal = "\\Device\\Mass2";
         break;
         }
   
         STRING PeriphOriginal = { strlen( periphOriginal ), strlen( periphOriginal ) + 1, periphOriginal };
         STRING LienSymbolique = { strlen( lecteurCible ), strlen( lecteurCible ) + 1, lecteurCible };
         ObCreateSymbolicLink( &LienSymbolique, &PeriphOriginal );
     }
   
    void Demonter( char* lettreLecteur )
    {
        char lecteurCible[16];
        sprintf_s( lecteurCible,"\\??\\%s", lettreLecteur );
   
        STRING LienSymbolique = { strlen(lecteurCible), strlen(lecteurCible) + 1, lecteurCible };
        ObDeleteSymbolicLink( &LienSymbolique );
    }
   
    // Here, we mount the part containing all major stuff (profile, xbox live game etc...)
    Monter(DEVICE_HARDISK0_PART1, "hdd1:");

    // We test if all working correctly by using the xex launching function
    XLaunchNewImage("hdd1:\\xexalancer.xex", NULL);
yo tambien pensaba en hacer un loader para ir probando, xeolx o algo asi, en honor a la comunidadx D
JohnCrichton escribió:yo tambien pensaba en hacer un loader para ir probando, xeolx o algo asi, en honor a la comunidadx D


¿EOLOADER?

[qmparto]

Gran idea, sería una gozada funcionar con ese programa. De fond podríamos poner un mosáico con los avatares de los Eolianos Jtageros [ok]
Os dejo otro codigo que he encontrado.

// Mount Drives
   bool Usb1 = CreateDriveMapping("\\?\\usb1:", "\\device\\mass0\\");
   bool Usb2 = CreateDriveMapping("\\?\\usb2:", "\\device\\mass1\\");
   bool Usb3 = CreateDriveMapping("\\?\\usb3:", "\\device\\mass2\\");

   WIN32_FIND_DATA wfd;

   // Get Handles
   HANDLE file1 = FindFirstFile("usb1:\\default.xex", &wfd); //CreateFile("usb1:\\default.xex", 0, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   HANDLE file2 = FindFirstFile("usb2:\\default.xex", &wfd); //CreateFile("usb2:\\default.xex", 0, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   HANDLE file3 = FindFirstFile("usb3:\\default.xex", &wfd); //CreateFile("usb3:\\default.xex", 0, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

   // Find Xex
   if (Usb1 && file1 != INVALID_HANDLE_VALUE)
   {
      FindClose(file1);
      XLaunchNewImage("usb1:\\default.xex", NULL);
   }
   else if (Usb2 && file2 != INVALID_HANDLE_VALUE)
   {
      FindClose(file2);
      XLaunchNewImage("usb2:\\default.xex", NULL);
   }
   else if (Usb3 && file3 != INVALID_HANDLE_VALUE)
   {
      FindClose(file3);
      XLaunchNewImage("usb3:\\default.xex", NULL);
   }
   else
      XLaunchNewImage(NULL, NULL);


Pero estos codigo necesita includes, ¿alguien sabe cuales son?

Saludos.

P.D.: Me repondo a mi mismo, xbox.h, winbase.h, pero la funcion CreateDriveMapping no me la reconoce.
Keihanzo escribió: De fond podríamos poner un mosáico con los avatares de los Eolianos Jtageros [ok]


Si soporta formato gif por mi encantado [qmparto]
SPlNeTe escribió:Os dejo otro codigo que he encontrado.

// Mount Drives
   bool Usb1 = CreateDriveMapping("\\?\\usb1:", "\\device\\mass0\\");
   bool Usb2 = CreateDriveMapping("\\?\\usb2:", "\\device\\mass1\\");
   bool Usb3 = CreateDriveMapping("\\?\\usb3:", "\\device\\mass2\\");

   WIN32_FIND_DATA wfd;

   // Get Handles
   HANDLE file1 = FindFirstFile("usb1:\\defailt.xex", &wfd); //CreateFile("usb1:\\default.xex", 0, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   HANDLE file2 = FindFirstFile("usb2:\\defailt.xex", &wfd); //CreateFile("usb2:\\default.xex", 0, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
   HANDLE file3 = FindFirstFile("usb3:\\defailt.xex", &wfd); //CreateFile("usb3:\\default.xex", 0, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

   // Find Xex
   if (Usb1 && file1 != INVALID_HANDLE_VALUE)
   {
      FindClose(file1);
      XLaunchNewImage("usb1:\\default.xex", NULL);
   }
   else if (Usb2 && file2 != INVALID_HANDLE_VALUE)
   {
      FindClose(file2);
      XLaunchNewImage("usb2:\\default.xex", NULL);
   }
   else if (Usb3 && file3 != INVALID_HANDLE_VALUE)
   {
      FindClose(file3);
      XLaunchNewImage("usb3:\\default.xex", NULL);
   }
   else
      XLaunchNewImage(NULL, NULL);


Pero estos codigo necesita includes, ¿alguien sabe cuales son?

Saludos.

P.D.: Me repondo a mi mismo, xbox.h, winbase.h, pero la funcion CreateDriveMapping no me la reconoce.


ojito que pone defailt.xex
Keihanzo escribió:
SPlNeTe escribió:Ya solucione el problema instalando el Visual Studio 2005 y el SP1. Hay bastantes ejemplos para probar, aunque lo suyo seria poder convertir nuestras consolas retail en dev para poder debugar el codigo de forma sencilla y no tener que estar compilando y pasadolo con un pendrive.

¿Por cierto alguno conoce la rutina para lanzar un xex?

Saludos.


¿En teoría no mandan las consolas con rebooter un log por el puerto lpt? quizá esa información os valga como debug...


No, manda un log a través del UART (Serial) de la placa.
He compilado el siguiente codigo y le he pasado el X360GameHack al xex, pero cuando lo lanzo desde el xexloader, me da un error (No se puede iniciar el juego).

#include "stdafx.h"
#include <stdio.h>
/*
   
    List of physical drive
   
    "\\Device\\Flash"
    "\\Device\\Mu1"
    "\\Device\\Mu0"
    "\\Device\\Cdrom0"
    "\\Device\\Harddisk0\\Partition0"
    "\\Device\\Harddisk0\\Partition1"
    "\\Device\\Harddisk0\\Partition2"
    "\\Device\\Harddisk0\\Partition3"
    "\\Device\\Mass0"
    "\\Device\\Mass1"
    "\\Device\\Mass2"
   
    */
   
    #define DEVICE_NAND_FLASH 0
    #define DEVICE_MEMORY_UNIT0 1
    #define DEVICE_MEMORY_UNIT1 2
    #define DEVICE_CDROM0 3
    #define DEVICE_HARDISK0_PART0 4
    #define DEVICE_HARDISK0_PART1 5
    #define DEVICE_HARDISK0_PART2 6
    #define DEVICE_HARDISK0_PART3 7
    #define DEVICE_USB0 8
    #define DEVICE_USB1 9
    #define DEVICE_USB2 10
   
    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
   
    // Follow the white rabbit ^^
    extern "C" int __stdcall ObCreateSymbolicLink( STRING*, STRING*);
    extern "C" int __stdcall ObDeleteSymbolicLink( STRING* );
   
    void Monter( int periphPhys, char* lettreLecteur )
     {
         char lecteurCible[16];
         sprintf_s( lecteurCible,"\\??\\%s", lettreLecteur );
   
         char * periphOriginal;
         switch( periphPhys )
         {
         case DEVICE_NAND_FLASH:
             periphOriginal = "\\Device\\Flash";
         break;
         case DEVICE_MEMORY_UNIT0:
             periphOriginal = "\\Device\\Mu0";
         break;
         case DEVICE_MEMORY_UNIT1:
             periphOriginal = "\\Device\\Mu1";
         break;
         case DEVICE_CDROM0:
             periphOriginal = "\\Device\\Cdrom0";
         break;
         case DEVICE_HARDISK0_PART0:
             periphOriginal = "\\Device\\Harddisk0\\Partition0";
         break;
         case DEVICE_HARDISK0_PART1:
             periphOriginal = "\\Device\\Harddisk0\\Partition1";
         break;
         case DEVICE_HARDISK0_PART2:
             periphOriginal = "\\Device\\Harddisk0\\Partition2";
         break;
         case DEVICE_HARDISK0_PART3:
             periphOriginal = "\\Device\\Harddisk0\\Partition3";
         break;
         case DEVICE_USB0:
             periphOriginal = "\\Device\\Mass0";
         break;
         case DEVICE_USB1:
             periphOriginal = "\\Device\\Mass1";
         break;
         case DEVICE_USB2:
             periphOriginal = "\\Device\\Mass2";
         break;
         }
   
         STRING PeriphOriginal = { strlen( periphOriginal ), strlen( periphOriginal ) + 1, periphOriginal };
         STRING LienSymbolique = { strlen( lecteurCible ), strlen( lecteurCible ) + 1, lecteurCible };
         ObCreateSymbolicLink( &LienSymbolique, &PeriphOriginal );
     }
   
    void Demonter( char* lettreLecteur )
    {
        char lecteurCible[16];
        sprintf_s( lecteurCible,"\\??\\%s", lettreLecteur );
   
        STRING LienSymbolique = { strlen(lecteurCible), strlen(lecteurCible) + 1, lecteurCible };
        ObDeleteSymbolicLink( &LienSymbolique );
    }
   
    // Here, we mount the part containing all major stuff (profile, xbox live game etc...)
    Monter(DEVICE_USB0, "usb0:");

    // We test if all working correctly by using the xex launching function
    XLaunchNewImage("usb0:\\MAME360.xex", NULL);

stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include <xtl.h>
#include <xboxmath.h>

// TODO: reference additional headers your program requires here

Alguiena idea de lo que puede pasar?

P.D. Error mio, estaba modificando una copia del programa que no era la que tenia añadida al proyecto.

Con el codigo anterior he podido compilar mi propio loader, ahora necesito informacion para poder acceder al sistema de ficheros de los dispositivos. Alguien me puede echar una mano?

Saludos.
He encontrao esto parece el source del usb loader o algo parecido podeis probarlo.
#include <xtl.h>
#include <xam.h>
#include <iostream>
#include <fstream>
#include "xfilecache.h"

using std::ifstream;
using std::ofstream;

typedef struct _STRING {
   USHORT Length;
   USHORT MaximumLength;
   PCHAR Buffer;
} STRING, *PSTRING;

extern "C" int __stdcall ObCreateSymbolicLink( STRING*, STRING*);
extern "C" int __stdcall ObDeleteSymbolicLink( STRING* );

HRESULT Map( CHAR* szDrive, CHAR* szDevice )
{
   CHAR * szSourceDevice;
   CHAR szDestinationDrive[16];

   szSourceDevice = szDevice;

   sprintf_s( szDestinationDrive,"\\??\\%s", szDrive );

   STRING DeviceName =
   {
      strlen(szSourceDevice),
      strlen(szSourceDevice) + 1,
      szSourceDevice
   };

   STRING LinkName =
   {
      strlen(szDestinationDrive),
      strlen(szDestinationDrive) + 1,
      szDestinationDrive
   };

   return ( HRESULT )ObCreateSymbolicLink( &LinkName, &DeviceName );
}

void launchX(char* xfile)
{
   XFlushUtilityDrive();
   XFileCacheInit(XFILECACHE_CLEAR_ALL,0,XFILECACHE_DEFAULT_THREAD,0,1);
   XFileCacheShutdown();
   XFlushUtilityDrive();
   XLaunchNewImage(xfile,0);
}
VOID __cdecl main()
{
   Map("hdd:","\\Device\\Harddisk0\\Partition1");
   Map("usb:","\\Device\\Mass0");
   Map("dvd:","\\Device\\Cdrom0");

   char path[128];
    ifstream config;
   config.open ("game:\\config.ini");
    if (config.is_open())
    {
      config.getline (path,128);
    }
   config.close();
   xContentLaunchNewImage(path);
}
Froggy__007 escribió:He encontrao esto parece el source del usb loader o algo parecido podeis probarlo.
#include <xtl.h>
#include <xam.h>
#include <iostream>
#include <fstream>
#include "xfilecache.h"

using std::ifstream;
using std::ofstream;

typedef struct _STRING {
   USHORT Length;
   USHORT MaximumLength;
   PCHAR Buffer;
} STRING, *PSTRING;

extern "C" int __stdcall ObCreateSymbolicLink( STRING*, STRING*);
extern "C" int __stdcall ObDeleteSymbolicLink( STRING* );

HRESULT Map( CHAR* szDrive, CHAR* szDevice )
{
   CHAR * szSourceDevice;
   CHAR szDestinationDrive[16];

   szSourceDevice = szDevice;

   sprintf_s( szDestinationDrive,"\\??\\%s", szDrive );

   STRING DeviceName =
   {
      strlen(szSourceDevice),
      strlen(szSourceDevice) + 1,
      szSourceDevice
   };

   STRING LinkName =
   {
      strlen(szDestinationDrive),
      strlen(szDestinationDrive) + 1,
      szDestinationDrive
   };

   return ( HRESULT )ObCreateSymbolicLink( &LinkName, &DeviceName );
}

void launchX(char* xfile)
{
   XFlushUtilityDrive();
   XFileCacheInit(XFILECACHE_CLEAR_ALL,0,XFILECACHE_DEFAULT_THREAD,0,1);
   XFileCacheShutdown();
   XFlushUtilityDrive();
   XLaunchNewImage(xfile,0);
}
VOID __cdecl main()
{
   Map("hdd:","\\Device\\Harddisk0\\Partition1");
   Map("usb:","\\Device\\Mass0");
   Map("dvd:","\\Device\\Cdrom0");

   char path[128];
    ifstream config;
   config.open ("game:\\config.ini");
    if (config.is_open())
    {
      config.getline (path,128);
    }
   config.close();
   xContentLaunchNewImage(path);
}


Yo diria que es el Quickboot, ya que abre un fichero config.ini y lee el .xex de la primera linea. Aunque el codigo es incorrecto o incompleto.

Alguien sabe porque usa (game:) como direccion del archivo config.ini.

Saludos.
una pregunta al conectar el sdk con la xbox q pide la ip i el nombre como lo se?
se supone que se usa (game:\\) es para sacar la ruta desde donde se ejecuta para poder localizar todos los recursos que tenga la aplicacion.
Espinete El codigo que pusite al compilar da error usaste algo en especial??

Acabo de probar el codigo que puse ayer es el quickboot y al compilar daba error le cambie esto
xContentLaunchNewImage(path);

por esto:

XLaunchNewImage( path, NULL );
y Funciona carga la aplicacion que establezcas en el config.ini
OORION escribió:una pregunta al conectar el sdk con la xbox q pide la ip i el nombre como lo se?


No puedes conectar la consola si no es una dev kit.
Froggy__007 escribió:se supone que se usa (game:\\) es para sacar la ruta desde donde se ejecuta para poder localizar todos los recursos que tenga la aplicacion.
Espinete El codigo que pusite al compilar da error usaste algo en especial??

Acabo de probar el codigo que puse ayer es el quickboot y al compilar daba error le cambie esto
xContentLaunchNewImage(path);

por esto:

XLaunchNewImage( path, NULL );
y Funciona carga la aplicacion que establezcas en el config.ini


Lo de game mo lo imaginaba, pero no sabia si iba a funcionar si lo empaquetaba en un PIRS.

void launchX(char* xfile)
{
   XFlushUtilityDrive();
   XFileCacheInit(XFILECACHE_CLEAR_ALL,0,XFILECACHE_DEFAULT_THREAD,0,1);
   XFileCacheShutdown();
   XFlushUtilityDrive();
   XLaunchNewImage(xfile,0);
}

Todo esto del codigo no tiene ninguna utilidad, o le falta codigo.

Yo tambien hice lo de cambiarle xContentLaunchNewImage(path); por el XLaunchNewImage( path, NULL );, pero me da un error de que no puede iniciar el juego.

Por cierto, seria interesante que nos crearamos un grupo de desarrollo para poder crear nuestro propio loader de codigo abierto. Asi seria mas facil implementar parches y no tener que esperar al xexloader. Ya tenemos la posibilidad de lanzar los xex, ahora necesitamos un gestor de ficheros y luego una GUI con todo al estilo del xexloader.

Habeis visto el ejemplo del SDK "XuiTutorial", no parece muy complicado el desarrolo de una GUI, aunque yo de C no tengo mucha idea.
Saludos.

P.D.: He estado investigando un poco y creo que las lineas siguientes son la clave de los programas, son los objetos con lo que se crean un "Symbolic Link" a las unidades.
extern "C" int __stdcall ObCreateSymbolicLink( STRING*, STRING*);
extern "C" int __stdcall ObDeleteSymbolicLink( STRING* );


Buscando por internet encontre esto.

http://msdn.microsoft.com/en-us/library/aa365682%28VS.85%29.aspx
Que versión del SDK estáis utilizando para hacer vuestras aplicaciones?

Yo tengo la versión del SDK 7645.1 (de hace un par de meses o por ahí) he visto que vienen un huevo de ejemplos de los que estábamos pidiendo.

Están en la ruta: C:\Archivos de programa\Microsoft Xbox 360 SDK\Source\Tools\SampleBrowser\

Ejecutais la aplicación "SampleBrowser.exe" y podreis instalaros los proyectos de ejemplo que vienen (viene de todo, usar liberías graficas, sonido, sistema, etc).

Yo por ahora me estoy estudiando esto y luego ya pasaré a intentar crear una aplicación sencilla, a ver que sale, que esto promete xD

Lo que hecho mucho en falta ahora mismo es un modo de poner la 360 en modo depuración, ya que como han dicho no se puede debugar facilmente, lo que convierte en proceso en algo muy lento... tener que compilar, pasarlo por el xbox360gamehack, pasarlo al usb y luego lanzarlo con el xexloader es un rollazo de proporciones épicas, especialmente cuando estas aprendiendo y vas a estar teniendo errores cada 2 por 3 xD

Saludos
bpSz escribió:Que versión del SDK estáis utilizando para hacer vuestras aplicaciones?

Saludos


Version 2.0.7645.0

Estoy intentando hacer una GUI con un explorador de archivos al estilo del xexloader, y estoy teniendo varios problemas porque de c++ no tengo mucha idea. Me estoy basando en el ejemplo XuiTutorial, modificando el skin con dos listas, una para los dispositivos y otra para los ficheros.

Este es el codigo para acceder a los dispositivos, "dir" contiene la ruta por ejemplo "usb0:\\*", y los añade a la lista2.
// Start the find and check for failure.
      hFind = FindFirstFile( dir, &wfd );
      if( INVALID_HANDLE_VALUE == hFind )
      {
         m_text1.SetText( "FindFirstFile failed." );
      }
      else
      {
      // Display each file and ask for the next.
         int i = 0;
         do
         {
            m_list2.InsertItems(i,1);
            m_list2.SetText(i, CharToWChart(wfd.cFileName));
            i++;
         } while( FindNextFile( hFind, &wfd ));
      // Close the find handle.
         FindClose( hFind );
      }

De momento consigo mostrar el directorio raiz del usb, pero para poder navegar necesito concatenar los textos y aqui es donde surge mi calvario, entre CHAR, LPCSTR y LPCWSTR. He creado agregado rutina para convertir CHAR en LPCWSTR, para poder mostrar los textos en pantalla.
LPCWSTR CharToWChart(CHAR cFileName[MAX_PATH])
{
   int len = strlen(cFileName)+1;
   wchar_t *wText = new wchar_t[len];
   memset(wText,0,len);
   ::MultiByteToWideChar( CP_ACP, NULL,cFileName, -1, wText,len );
   return wText;
}


Pero tengo problemas para hacer algunas conversiones y sobre todo concatenar texto para crear las rutas.

Las funciones strcat y strcat_s hacen que no casque el programa.

¿Como concateno un LPCSTR y un texto como este "\\*"?
¿Y como convierto un LPCSTR en CHAR[260]?

Si teneis ganas y algunos conocimientos de programacion, puedo pasaros el codigo fuente para poder colaborar.

Saludos.
SPlNeTe, yo de C++ soy noob total pero a ver si esto te puedo ayudar...

Porque usas un LPCSTR? no puedes hacerlo con las strings de C++? Algo como:

#include <string>

std::string strOne = "Hello ";
std::string strTwo = "World";

std::string strThree = strOne + strTwo;


Con un LPCSTR lo que he leído por la red es que se puede hacer así:

LPCSTR Str_1 = "Hello";
LPCSTR Str_2 = " World!";

LPSTR Result = new CHAR[strlen(Str_1) + strlen(Str_2) + 1 ];
strcpy(Result, Str_1);
strcat(Result, Str_2);


Espero que te ayude.

*************

A ver si alguno a leido algo de poner la consola en modo depuración por ahí... facilitaría mucho las cosas. De momento no tengo el jtag hecho porque no tengo un soldador y por lo tanto no puedo ir probando lo que vaya haciendo, pero en cuanto me haga con uno me lío con el hack y dejo la consola niquelada para ir probando las cosas que vaya haciendo xD

Saludos
Gracias bpSz por la ayuda, he corregido el problema con el segundo codigo que has puesto, ya me funciona la concatenacion de textos. Ahora vamos a montar el resto.

Saludos.
donde descargaron el SDK pueden mandarme un MP :)
Buenas,

Quiero ponerme a programar un poquito y así de paso aprendo un poco de C++.

¿Me puedes decir que es lo que necesito para empezar?

Tengo el SDK 7645.1.

¿Que más necesito para montar el entorno?

Un saludo.
El SDK lo baje del cielo xbox, traduce y googlea. Para empezar a programa necesitais instalar el Visual Studio 2005 y actualizarlo con el SP1. Con esto ya podeis intalar el SDK Full, con ejemplos.

Por cierto, tengo otro problema, no consigo transformar LPCWSTR en LPCSTR.

Para hacer lo contrario uso MultiByteToWideChar, pero con la funcion contraria WideCharToMultiByte, no consiguo que funcione.

El problema es que los textos de la GUI estan en LPCWSTR, y para poder formar el nombre de los directorios, necesito pasarlos a CHAR[260].

Actualmente uso esto, ¿como devuelvo el puntero a un CHAR[260] y le asigno el valor una variable?

CHAR *WCharToChart(LPCWSTR cFileName)
{
   char Text[MAX_PATH]= "\0";;
   memset(Text,0,MAX_PATH);
   ::WideCharToMultiByte( CP_ACP, NULL,cFileName, -1, Text,MAX_PATH,NULL,NULL );
   return &Text;
}


naxeras, con el codigo que hay en este hilo, ya podrias empezar a probar. Te recomiendo que mires los ejemplos que vienen con el SDK, yo me he basado en el XuiTutorial para montar el explorardor. Solo tiene que añadir las rutinas para montar la unidades y luego usar las funciones FindFirstFile y FindNextFile para que te devuelva el nombre de los ficheros.

Esta es la funcion para leer un directorio y añadir el nombre de sus directorios y ficheros a la m_lista2 de tipo CXuiList.
//----------------------------------------------------------------------------------
    // Abre un dispositivo y rellena la lista con los nombres.
    //----------------------------------------------------------------------------------
   HRESULT OpenDevice(LPCSTR strFind)
   {
      HANDLE hFind;
      WIN32_FIND_DATA wfd;

      m_list2.DeleteItems(0, m_list2.GetItemCount());

      LPCSTR todos = "\\*";
      LPSTR dir = new CHAR[strlen(strFind) + strlen(todos) + 1 ];
      strcpy(dir, strFind);
      strcat(dir, todos);

   // Start the find and check for failure.
      hFind = FindFirstFile( dir, &wfd );
      if( INVALID_HANDLE_VALUE == hFind )
      {
          m_text1.SetText(CharToWChart(dir));
      }
      else
      {
      // Display each file and ask for the next.
         int i = 0;
         do
         {
            m_list2.InsertItems(i,1);
            m_list2.SetText(i, CharToWChart(wfd.cFileName));
            i++;
         } while( FindNextFile( hFind, &wfd ));
      // Close the find handle.
         FindClose( hFind );
      }
      return S_OK;
   }

Saludos.

P.D.: Despues de mucho trabajo porfir he terminado una version muy beta de un xex loader con navegacion por directorios. Ahora falta meterle la opcion de copiar,cortar y pegar, añadir el tamaño de la unidad y los archivos. Ademas de implementar el montaje y comprobacion de unidades montas, ya que ahora lo hago manualmente.

No tengo ni idea de C++ y he podido montar mi propio loader, lo cierto es que mucho curro me ha llevado, pido colaboracion porque lo cierto es que a veces me atasco y estoy a punto de mandarlo a la mierda, ademas que ahora estoy de vacaciones y puedo hacer pruebas, pero dentro de poco no tendre tanto tiempo.

Si alguno sabe programar y tiene ganas que me avise.
Ya veo que no soy el unico aqui a estas horas. XD

Gracias bpSz, pero ya solucione ese problema. Ahora necesito colaboracion, veo que la gente esta haciendo "skins" para el nuevo xexloader, aunque solo se puede cambiar el fondo, yo necesito el diseño de todo el loader, dentro de las posibilidades que nos da Xbox UI Tool.

Saludos.
Me quedé atrapado en una web leyendo sobre unas cosas de C++ jajajaj

Madre mía que horas xD

Siempre nos quedará el foro de MS para preguntar dudas. Quién mejor para darnos datos que los propios desarrolladores oficiales? xDDDDDDD

http://social.msdn.microsoft.com/Forums ... ry/visualc

Yo creo que si no se pone codigo muy específico del sdk no tiene porque pasar nada... todo será que un día de estos te entre un swat por la ventana de casa xDD

Saludos
Como avanza esto.
Espinete podias pasarme una copia del proyecto y echarte una mano.
Gracias Froggy__007 te paso una copia del proyecto, te aviso que aunque funciona, puede el codigo de miedo.

Y para los incredulos os pongo un video echo con el movil.

http://www.youtube.com/watch?v=q6poXqdCnGs

Saludos.
tiene buen aspecto, yo quiero formatear mi PC y luego instalo el SDK y me pongo a probar no se mucho de C++ pero si algo de C espero poder hacer algo bueno :), me podrías pasar un copia del código para echarle un vistazo?
Ya veo que alguno se va animando, aunque os falta tener todo el tinglado montado para hacer pruebas.

Os recuerdo que cada vez que compileis el proyecto tenes que pasalo por el X360GameHack. He dejado un poco de lado la funcionalidad de copiar ficheros para centrarme en el aspecto visual. Ya he conseguido pasarle iconos, aunque se muestran a la derecha de los nombres y no se como se cambia de lado.

Tambien he echo algunas pruebas con el archivo nxeart que biene con los nuevos juegos, segun parece es un PIRS, y creo que se puede acceder a su contenido de alguna manera, pero aun no lo he conseguido. Alguna idea?

Saludos.

P.D.: Quiero compartir el proyecto, ya que estoy un poco cansado/atascado, sin debuger esto es un infierno de prueba y error.
Espero que esto anime a mas gente a desarrollar un loader propio y de codigo abierto.

http://rapidshare.com/files/328492494/XuiTutorial.rar.html
Manda narices me estan volviendo loco los controles.
como se olcultan los elementos de una commonlist ??




Aqui os dejo la rutina para copiar el dvd en una unidad usb.(Sacada del source del XboxCopy de Xbox1)

char* GetNextPath(char *drive)
{
   static char testname[1024];
   char drivepath[1024];
   int count=0;
   WIN32_FIND_DATA wfd;
   HANDLE hFind;
   boolean GoodOne=true;

   strcpy(drivepath,drive);
   strcat(drivepath,"*");

   while(count<=999)
   {
      sprintf(testname,"XBCopy%03d",count);
      GoodOne=true;

      // Start the find and check for failure.
      hFind = FindFirstFile(drivepath, &wfd );

      // See if this exists in the directory
       do
       {
         // Only do directories
         if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY && strcmp(wfd.cFileName,testname)==0)
         {
            GoodOne=false;
            break;
         }
       }
       while(FindNextFile( hFind, &wfd ));
       // Close the find handle.
       FindClose( hFind );

      if(GoodOne) break;
      count++;
   }
   strcat(testname,"\\");

   return testname;

}
//____________________________________________________


bool DumpDVDtoHD(char *path,char *destroot)
{
   char sourcesearch[1024]="";
   char sourcefile[1024]="";
   char destfile[1024]="";
   WIN32_FIND_DATA wfd;
   HANDLE hFind;


   // We must create the dest directory
   if(CreateDirectory(destroot,NULL))
   {
//      if(mpDebug) mpDebug->MessageInstant(L"XBCopy() - Created Directory: %hs",destroot);
   }

   strcpy(sourcesearch,path);
   strcat(sourcesearch,"*");

   // Start the find and check for failure.
   hFind = FindFirstFile( sourcesearch, &wfd );

   if( INVALID_HANDLE_VALUE == hFind )
   {
       //if(mpDebug) mpDebug->MessageInstant(L"XBCopy() - SetDirectory FindFirstFile returned invalid HANDLE");
       return false;
   }
   else
   {
       // Display each file and ask for the next.
       do
       {
         strcpy(sourcefile,path);
         strcat(sourcefile,wfd.cFileName);

         strcpy(destfile,destroot);
         strcat(destfile,wfd.cFileName);

         // Only do files
         if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
         {
            strcat(sourcefile,"\\");
            strcat(destfile,"\\");
            mDirCount++;
            // Recursion
            if(!DumpDVDtoHD(sourcefile,destfile)) return false;
         }
         else
         {
            
            LPSTR copiando = new char[MAX_PATH];
            LPWSTR copiandow = new wchar_t[MAX_PATH];
            LPSTR fileName = new char[MAX_PATH];
            LPWSTR fileNamew = new wchar_t[MAX_PATH];
                fileName = wfd.cFileName;
                ::MultiByteToWideChar( CP_ACP, NULL,copiando, -1, copiandow, MAX_PATH);
                //sprintf(string1,L"copiando",wfd.cFileName);
            if   (m_text1.SetText(copiandow));
//            if(mpDebug) mpDebug->MessageInstant(L"XBCopy() - Copying: %hs",wfd.cFileName);
            if(!CopyFile(sourcefile,destfile,0))
            {
             
               //  if(mpDebug) mpDebug->MessageInstant(L"XBCopy() - Failed to copy %hs to %hs",sourcefile,destfile);
               return false;
            }
            SetFileAttributes(destfile,FILE_ATTRIBUTE_NORMAL);
            mFileCount++;
         }

       }
       while(FindNextFile( hFind, &wfd ));

       // Close the find handle.
       FindClose( hFind );
   }
   return true;
}
//_____________________________________________________________________
public:
    char      mDestPath[1024];
    int         mCounter;
   int         mFileCount;
   int         mDirCount;
//___________________________________________________________________________
// Y esto la accion al presionar el boton
//--------------------------------------
{
            m_text1.SetText( L"One" );
                   strcpy(mDestPath,"usb0:\\");
         strcat(mDestPath,GetNextPath(mDestPath));
         mCounter++;
         DumpDVDtoHD("cdrom0:\\",mDestPath);
      }


Tambien le e echado un ojo al source xboxftp y trae rutinas interesantes por ejemplo la de montar las unidades la tenemos en el main.cpp y en el localfilehandler.cpp hay rutinas de copiar mover etc.

El archivo undocumented.h creo que se podria añadir a un proyecto de xbox360 sin problemas echarle un ojo tmb.
Espinete si señor bien esplicaito todo a ver si saco un poco de tiempo y me ponso mas a esto aunque los controles me estan volviendo loco.
Porque en vez de intentar ocultarlos, los eliminas con
lista.DeleteItems(indice, cantidad)


Gracias por el codigo. Estoy intentando implementar la gestion de archivos, pero no consigo hacelos funcionar. Ademas que queria que se mostrase una barra de progreso.

Saludos.
Alguno a probado si con el nuevo XBR hace falta pasar el ejecutable por el 360gamehack?

pd: spinete tiene muy buena pinta el codigo.
Ya no es necesario parchearlo, nos ahorramos un paso, para estar haciendo pruebas.

Publico mi ultima modificacion con la opcion de copiar, cortar, pegar y borrar (pero solo ficheros, no directorios). Estoy haciendo pruebas con la extraccion de la imagen de fondo de los juegos, pero no consigo crear el fichero correctamente. El fichero nxeart es un PIRS y por lo tanto tiene que existir una funcion para abrir su contenido y acceder a los ficheros que contiene. Pero sin debug y con mis escasos conocimientos no lo he conseguido todabia.

//--------------------------------------------------------------------------------------
// Loader Beta
// by SPlNeTe
//
// Thanks to Ski-lleR for your code
//--------------------------------------------------------------------------------------
#include <xtl.h>
#include <xui.h>
#include <xuiapp.h>
#include <stdio.h>
#include <xtl.h>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
/*
   
    List of physical drive
   
    "\\Device\\Flash"
    "\\Device\\Mu1"
    "\\Device\\Mu0"
    "\\Device\\Cdrom0"
    "\\Device\\Harddisk0\\Partition0"
    "\\Device\\Harddisk0\\Partition1"
    "\\Device\\Harddisk0\\Partition2"
    "\\Device\\Harddisk0\\Partition3"
    "\\Device\\Mass0"
    "\\Device\\Mass1"
    "\\Device\\Mass2"
   
    */
   
    #define DEVICE_NAND_FLASH 0
    #define DEVICE_MEMORY_UNIT0 1
    #define DEVICE_MEMORY_UNIT1 2
    #define DEVICE_CDROM0 3
    #define DEVICE_HARDISK0_PART0 4
    #define DEVICE_HARDISK0_PART1 5
    #define DEVICE_HARDISK0_PART2 6
    #define DEVICE_HARDISK0_PART3 7
    #define DEVICE_USB0 8
    #define DEVICE_USB1 9
    #define DEVICE_USB2 10
   
    typedef struct _STRING {
        USHORT Length;
        USHORT MaximumLength;
        PCHAR Buffer;
    } STRING;
   
    // Follow the white rabbit ^^
    extern "C" int __stdcall ObCreateSymbolicLink( STRING*, STRING*);
    extern "C" int __stdcall ObDeleteSymbolicLink( STRING* );

HRESULT Monter( int periphPhys, char* lettreLecteur )
{
   char lecteurCible[16];
    sprintf_s(lecteurCible,"\\??\\%s", lettreLecteur );
   
   char * periphOriginal;
    switch( periphPhys )
    {
    case DEVICE_NAND_FLASH:
      periphOriginal = "\\Device\\Flash";
        break;
    case DEVICE_MEMORY_UNIT0:
        periphOriginal = "\\Device\\Mu0";
        break;
    case DEVICE_MEMORY_UNIT1:
        periphOriginal = "\\Device\\Mu1";
        break;
    case DEVICE_CDROM0:
        periphOriginal = "\\Device\\Cdrom0";
        break;
    case DEVICE_HARDISK0_PART0:
        periphOriginal = "\\Device\\Harddisk0\\Partition0";
        break;
    case DEVICE_HARDISK0_PART1:
        periphOriginal = "\\Device\\Harddisk0\\Partition1";
        break;
    case DEVICE_HARDISK0_PART2:
        periphOriginal = "\\Device\\Harddisk0\\Partition2";
        break;
    case DEVICE_HARDISK0_PART3:
        periphOriginal = "\\Device\\Harddisk0\\Partition3";
        break;
    case DEVICE_USB0:
        periphOriginal = "\\Device\\Mass0";
        break;
    case DEVICE_USB1:
        periphOriginal = "\\Device\\Mass1";
        break;
    case DEVICE_USB2:
        periphOriginal = "\\Device\\Mass2";
        break;
   }
    STRING PeriphOriginal = { strlen( periphOriginal ), strlen( periphOriginal ) + 1, periphOriginal };
    STRING LienSymbolique = { strlen( lecteurCible ), strlen( lecteurCible ) + 1, lecteurCible };
   return ( HRESULT )ObCreateSymbolicLink( &LienSymbolique, &PeriphOriginal );
}
   
HRESULT Demonter( char* lettreLecteur )
{
   char lecteurCible[16];
    sprintf_s( lecteurCible,"\\??\\%s", lettreLecteur );
   
   STRING LienSymbolique = { strlen(lecteurCible), strlen(lecteurCible) + 1, lecteurCible };
    return ( HRESULT )ObDeleteSymbolicLink( &LienSymbolique );
}
//--------------------------------------------------------------------------------------
// Scene implementation class.
//--------------------------------------------------------------------------------------
class CMyMainScene : public CXuiSceneImpl
{

protected:

    // Control and Element wrapper objects.
    CXuiTextElement m_text1;
    CXuiTextElement m_text2;
   CXuiList m_list1;
   CXuiList m_list2;
   CXuiList m_list3;
   CXuiImageElement m_image1;
   CXuiScrollBar m_scrollBar1;
   CXuiProgressBar m_progressBar1;
   CXuiElement m_button1;

   string sDirAct;
   string sSelectedFiles[1000];

    #define COPY 0
    #define CUT 1
    #define DEL 2
   int iManagerOption;

    // Message map.
    XUI_BEGIN_MSG_MAP()
        XUI_ON_XM_INIT( OnInit )
        XUI_ON_XM_NOTIFY_PRESS( OnNotifyPress )
      XUI_ON_XM_KEYDOWN( OnKeyDown )
    XUI_END_MSG_MAP()

    //----------------------------------------------------------------------------------
    // Performs initialization tasks - retreives controls.
    //----------------------------------------------------------------------------------
    HRESULT OnInit( XUIMessageInit* pInitData, BOOL& bHandled )
    {
      // Retrieve controls for later use.
        GetChildById( L"XuiText1", &m_text1 );
        GetChildById( L"XuiText2", &m_text2 );
        GetChildById( L"XuiCommonList1", &m_list1 );
        GetChildById( L"XuiCommonList2", &m_list2 );
        GetChildById( L"XuiCommonList3", &m_list3 );
      GetChildById( L"XuiImage1", &m_image1 );
      GetChildById( L"XuiScrollBar1", &m_scrollBar1 );
      GetChildById( L"XuiProgressBar1", &m_progressBar1 );
      GetChildById( L"XuiButton1", &m_button1 );

      // Montamos los dispositivos
//      if (ERROR_SUCCESS == Monter(DEVICE_CDROM0, "dvd0:"))
//         m_list1.DeleteItems(3, 1);
      Monter(DEVICE_CDROM0, "dvd0:");
      Monter(DEVICE_USB0, "usb0:");
      Monter(DEVICE_HARDISK0_PART1, "hdd1:");
      Monter(DEVICE_NAND_FLASH, "flash:");

      //Oculta los elementos inecesarios
      m_list3.SetOpacity(0);
      m_text2.SetOpacity(0);
      m_progressBar1.SetOpacity(0);
      m_button1.SetOpacity(0);

      //Enfoca la lista de dispositivos
      m_list1.SetFocus(XUSER_INDEX_ANY);

      return S_OK;
    }
    //----------------------------------------------------------------------------------
    // Handler for the button press message.
    //----------------------------------------------------------------------------------
    HRESULT OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandled )
    {
      LPSTR fileName = new char[MAX_PATH];
      LPSTR fullPath = new char[MAX_PATH];
      LPSTR device = new char[MAX_PATH];

        // Si se ha pulsado un boton de la lista de dispositivos
        if( hObjPressed == m_list1 )
      {
           bHandled = TRUE;
         //Se convierte el nombre del dispositivo a caracteres anchos
         ::WideCharToMultiByte( CP_ACP, NULL,m_list1.GetText(m_list1.GetCurSel()), -1, device,MAX_PATH,NULL,NULL );
         //Se ocualta la lista de dispositivos
         m_list1.SetOpacity(0);
         //Se muestra el dispositivo seleccionado
         OpenDevice(device);
      }
        // Si se ha pulsado un boton de la lista de ficheros
      else if( hObjPressed == m_list2 )
      {   
         bHandled = TRUE;
         //Añade una barra al directorio actual
         sDirAct+="\\";
         //Convierte el nombre del fichero a caracteres
         ::WideCharToMultiByte(CP_ACP,NULL,m_list2.GetText(m_list2.GetCurSel()),-1,fileName,MAX_PATH,NULL,NULL);
         //Añade el nombre del fichero al directorio Actual
         sDirAct+= fileName;
         //Copia el sDirAct al puntero directorio
         sDirAct._Copy_s(fullPath, sDirAct.length(),sDirAct.length());
         //Añade el final del fichero
         fullPath[sDirAct.length()]='\0';

         //Si el fichero seleccionado es un directorio
         if(FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(fullPath))
         {
            //Abre el directorio
            OpenDevice(fullPath);
         }
         else
         //Si es un fichero
         {
            //Se comprueba si es un ejecutable
            string str = fileName;
            if (str.find(".xex")!=string::npos)
            {
               //Se lanza el ejecutable
               XLaunchNewImage(fullPath, NULL);
            }   
         }
      }
        // Si se ha pulsado un boton de la lista de opciones de ficheros
        else if( hObjPressed == m_list3 )
      {
           bHandled = TRUE;
         //Si se ha seccionado "Copiar"
         if (m_list3.GetCurSel()==0)
         {
            iManagerOption = COPY;
            SelectCheckedFiles();
         }
         //Si se ha seccionado "Cortar"
         else if (m_list3.GetCurSel()==1)
         {
            iManagerOption = CUT;
            SelectCheckedFiles();
         }
         //Si se ha seccionado "Pegar"
         else if (m_list3.GetCurSel()==2)
         {
            PasteFiles();
         }
         //Si se ha seccionado "Borrar"
         else if (m_list3.GetCurSel()==3)
         {
            iManagerOption = DEL;
            SelectCheckedFiles();
            DeleteFiles();
         }
         //Si se ha seccionado "Crear"
         else if (m_list3.GetCurSel()==4)
         {
            m_text1.SetText(L"Crear");
            CreateDir();
         }
         //Se oculta la lista de opciones
         m_list3.SetOpacity(0);
         //Se enfoca la lista de ficheros
         m_list2.SetFocus(XUSER_INDEX_ANY);
      }

      return S_OK;
    }
    //----------------------------------------------------------------------------------
    // Handler for the button press message.
    //----------------------------------------------------------------------------------
   HRESULT OnKeyDown(XUIMessageInput *pInputData, BOOL& bHandled)
   {
      string str;
      CXuiControl ItemCtrl1;
      CXuiControl ItemCtrl2;
      CXuiControl ItemCtrl3;

      // Recuperamos los botones seleccionado de todas las listas
      // para comprobar en que lista esta enfocada
      m_list1.GetCurSel(&ItemCtrl1);
      m_list2.GetCurSel(&ItemCtrl2);
      m_list3.GetCurSel(&ItemCtrl3);

      // Si se pulsa sobre la lista de dispositivos
      if ( ItemCtrl1 == ItemCtrl1.GetFocus(XUSER_INDEX_ANY))
      {
         // Si se pulsa el boton B
         if ( pInputData->dwKeyCode == VK_PAD_B )
         {
            //Se ocualta la lista de dispositivos
            m_list1.SetOpacity(0);
            //Enfoca la lista de archivos
            m_list2.SetFocus(XUSER_INDEX_ANY);

            bHandled = TRUE;
         }
      }
      // Si se pulsa sobre la lista de ficheros
      else if ( ItemCtrl2 == ItemCtrl2.GetFocus(XUSER_INDEX_ANY))
      {
         // Si se pulsa el boton B
         if ( pInputData->dwKeyCode == VK_PAD_B )
         {
            //Se obtiene la posicion de la ultima barra del directorio actual
            size_t pos = sDirAct.find_last_of("\\");
            if (pos!=string::npos)
            {
               //Se extrae el subdirectorio
               sDirAct = sDirAct.substr(0,pos);
               //Se abre el subdirectorio
               OpenDevice(sDirAct);
            }
            bHandled = TRUE;
         }
         // Si se pulsa el boton BACK
         else if ( pInputData->dwKeyCode == VK_PAD_BACK )
         {
            //Se muestra la lista de dispositivos
            m_list1.SetOpacity(1);
            //Se enfoca la lista de dispositivos
            m_list1.SetFocus(XUSER_INDEX_ANY);

            bHandled = TRUE;
         }
         // Si se pulsa el boton X
         else if ( pInputData->dwKeyCode == VK_PAD_X )
         {
            // Si el boton seleccionado esta marcado
            if ( TRUE == m_list2.GetItemCheck(m_list2.GetCurSel()))
            {
               // Se quita la marca y se habilita
               m_list2.SetItemCheck(m_list2.GetCurSel(), FALSE);
               m_list2.SetItemEnable(m_list2.GetCurSel(), TRUE);
            }
            // Si el boton seleccionado no esta marcado
            else
            {
               // Se marca y se deshabilita
               m_list2.SetItemCheck(m_list2.GetCurSel(), TRUE);
               m_list2.SetItemEnable(m_list2.GetCurSel(), FALSE);
            }
            bHandled = TRUE;
         }
         // Si se pulsa el boton Y
         else if ( pInputData->dwKeyCode == VK_PAD_Y )
         {
            // Se muestra la lista de opciones
            m_list3.SetOpacity(1);
            // Se enfoca la lista de opciones
            m_list3.SetFocus(XUSER_INDEX_ANY);

            bHandled = TRUE;
         }
         // Si se pulsa arriba en el pad
         else if ( pInputData->dwKeyCode == VK_PAD_DPAD_UP )
         {
            XuiScrollBarSetItemData( m_scrollBar1, m_list2.GetItemCount(), m_list2.GetCurSel(), 7 );
         }
         // Si se pulsa abajo en el pad
         else if ( pInputData->dwKeyCode == VK_PAD_DPAD_DOWN )
         {
            XuiScrollBarSetItemData( m_scrollBar1, m_list2.GetItemCount(), m_list2.GetCurSel(), 7 );
         }
      // Si se pulsa sobre la lista de opciones de ficheros
      }
      else if( ItemCtrl3 == ItemCtrl2.GetFocus(XUSER_INDEX_ANY))
      {
         // Si se pulsa el boton B
         if ( pInputData->dwKeyCode == VK_PAD_B )
         {
            //Se ocualta la lista de dispositivos
            m_list3.SetOpacity(0);
            //Enfoca la lista de archivos
            m_list2.SetFocus(XUSER_INDEX_ANY);

            bHandled = TRUE;
         }
      }
      return S_OK;
   }
    //----------------------------------------------------------------------------------
    // Abre un dispositivo y rellena la lista con los nombres.
    //----------------------------------------------------------------------------------
   HRESULT OpenDevice(string strFind)
   {
      HANDLE hFind;                        //Manejador de ficheros
      WIN32_FIND_DATA wfd;                  //Informacion de los ficheros
      LPSTR lpPath = new char[MAX_PATH];         //Directorio
      LPWSTR lpPathW = new wchar_t[MAX_PATH];      //Directorio en caracteres anchos
      LPSTR lpFileName = new char[MAX_PATH];      //Nombre del fichero
      LPWSTR lpFileNameW = new wchar_t[MAX_PATH];   //Nombre del fichero en caracteres anchos
      string sFileName;

      // Elimino todos los Items de la lista
      m_list2.DeleteItems(0, m_list2.GetItemCount());

      //Guarda el directorio actual
      sDirAct = strFind;
      //Enfoca la lista de archivos
      m_list2.SetFocus(XUSER_INDEX_ANY);
      //Añado \* al directorio para buscar todos los archivos
      strFind+= "\\*";
      //Copia el directorio al puntero directorio
      strFind._Copy_s(lpPath, strFind.length(),strFind.length());
      //Añade el final del fichero
      lpPath[strFind.length()]='\0';
      //Convierte el directorio a caracteres anchos directorioW      
      ::MultiByteToWideChar( CP_ACP, NULL,lpPath, -1, lpPathW, MAX_PATH);
      // Muestro el nombre del directorio explorado
      m_text1.SetText(lpPathW);

      // Empieza la busqueda de ficheros
      hFind = FindFirstFile( lpPath, &wfd );
      if( INVALID_HANDLE_VALUE == hFind )
      {
         //Si falla la busqueda
      }
      else
      {
         int nIndex = 0;
         // Se trata el fichero y se obtiene el siguiente
         do
         {
            // Inserto un Item en la lista y le paso el nombre del fichero convirtiendolo en caracteres anchos
            m_list2.InsertItems(nIndex,1);
            sFileName = wfd.cFileName;
            //Copia el fichero al puntero
            sFileName._Copy_s(lpFileName, sFileName.length(), sFileName.length());
            //Añade el final del fichero
            lpFileName[sFileName.length()]='\0';
            ::MultiByteToWideChar( CP_ACP, NULL,lpFileName, -1, lpFileNameW, MAX_PATH);
            m_list2.SetText(nIndex,lpFileNameW);

            //Segun el tipo de fichero se asigna un icono            
            if(FILE_ATTRIBUTE_DIRECTORY == wfd.dwFileAttributes)
            {
               m_list2.SetImage(nIndex,L"file://game:/media/icons/folder.png");
            }
            else if ((sFileName.find(".xex"))!=string::npos)
            {
               m_list2.SetImage(nIndex,L"file://game:/media/icons/xex.png");
            }
            else
               m_list2.SetImage(nIndex,L"file://game:/media/icons/file.png");

            if (sFileName.find("nxeart")!=string::npos)
            {
            //   CargarFondo2();
            }   
            nIndex++;
         } while( FindNextFile( hFind, &wfd ));
         // Cierra el manejador de la busqueda
         FindClose( hFind );
      }
      return S_OK;
   }
    //----------------------------------------------------------------------------------
    // Selecciona los directorios y ficheros seleccionados
    //----------------------------------------------------------------------------------
   VOID SelectCheckedFiles()
   {
      LPSTR lpFileName = new char[MAX_PATH];      //Nombre del fichero
      int nCount = 0;
      for (int i=0; i<m_list2.GetItemCount(); i++)
      {
         if (m_list2.GetItemCheck(i))
         {
            //Convierte el nombre del fichero a caracteres
            ::WideCharToMultiByte(CP_ACP,NULL,m_list2.GetText(i),-1,lpFileName,MAX_PATH,NULL,NULL);
            //Añade el nombre del fichero al directorio Actual
            sSelectedFiles[nCount]= sDirAct;
            sSelectedFiles[nCount]+= "\\";
            sSelectedFiles[nCount]+= lpFileName;
            nCount++;
         }
      }
      sSelectedFiles[nCount].clear();
   }
   //----------------------------------------------------------------------------------
    // Copya los ficheros y directorios del directorio pasado al sDirAct
    //----------------------------------------------------------------------------------
   VOID CopyDirectory(string sDestino, string sOrigen)
   {
      HANDLE hFind;                     //Manejador de ficheros
      WIN32_FIND_DATA wfd;               //Informacion de los ficheros
      LPSTR lpOrigen = new char[MAX_PATH];      //Directorio
      LPSTR lpDestino = new char[MAX_PATH];
      string sPathOrig;
      string sPathDest;

      sPathOrig = sOrigen;
      //Añado \* al directorio para buscar todos los archivos
      sPathOrig+= "\\*";
      //Copia el directorio al puntero directorio
      sPathOrig._Copy_s(lpOrigen, sPathOrig.length(), sPathOrig.length());
      //Añade el final del fichero
      lpOrigen[sPathOrig.length()]='\0';
      // Empieza la busqueda de ficheros
      hFind = FindFirstFile( lpOrigen, &wfd );
      if( INVALID_HANDLE_VALUE == hFind )
      {
         //Si falla la busqueda
      }
      else
      {
         // Se trata el fichero y se obtiene el siguiente
         do
         {
            sPathOrig = sOrigen;
            sPathOrig+="\\";
            sPathOrig+= wfd.cFileName;
            sPathOrig._Copy_s(lpOrigen, sPathOrig.length(), sPathOrig.length());
            lpOrigen[sPathOrig.length()]='\0';
            sPathDest = sDestino;
            sPathDest+= "\\";
            sPathDest+= wfd.cFileName;
            sPathDest._Copy_s(lpDestino, sPathDest.length(), sPathDest.length());
            lpDestino[sPathDest.length()]='\0';

            //Si el fichero a copia es un directorio
            if (wfd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
            {
               //Se crea el directorio
               CreateDirectory(
                 lpDestino, // directory name
                 NULL // SD
               );
               CopyDirectory(sPathDest, sPathOrig);
               if (iManagerOption == CUT)
               RemoveDirectory(lpOrigen);

            }
            else
            {
               if (iManagerOption == COPY)
               {
                  CopyFileEx(
                    lpOrigen, // name of existing file
                    lpDestino, // name of new file
                    NULL,//CopyProgressRoutine, // callback function
                    NULL, // callback parameter
                    NULL, // cancel status
                    NULL
      //              COPY_FILE_FAIL_IF_EXISTS // copy iManagerOptions
                  );
               }
               else if (iManagerOption == CUT)
               {
                  MoveFileWithProgress(
                    lpOrigen, // name of existing file
                    lpDestino, // name of new file
                    NULL, //CopyProgressRoutine, // callback function
                    NULL, // callback parameter
                    MOVEFILE_REPLACE_EXISTING
      //              COPY_FILE_FAIL_IF_EXISTS // copy iManagerOptions
                  );
               }
            }
         } while( FindNextFile( hFind, &wfd ));
         // Cierra el manejador de la busqueda
         FindClose( hFind );
      }
   }
   //----------------------------------------------------------------------------------
    // Elimina los ficheros y directorios del directorio pasado
    //----------------------------------------------------------------------------------
   VOID DeleteDirectory(string sPath)
   {
      HANDLE hFind;                        //Manejador de ficheros
      WIN32_FIND_DATA wfd;                  //Informacion de los ficheros
      LPSTR lpPath = new char[MAX_PATH];      //Directorio
      string sDirPath;

      sDirPath = sPath;
      //Añado \* al directorio para buscar todos los archivos
      sDirPath+= "\\*";
      //Copia el directorio al puntero directorio
      sDirPath._Copy_s(lpPath, sDirPath.length(), sDirPath.length());
      //Añade el final del fichero
      lpPath[sDirPath.length()]='\0';
      // Empieza la busqueda de ficheros
      hFind = FindFirstFile( lpPath, &wfd );
      if( INVALID_HANDLE_VALUE == hFind )
      {
         //Si falla la busqueda
      }
      else
      {
         // Se trata el fichero y se obtiene el siguiente
         do
         {
            sDirPath = sPath;
            sDirPath+= "\\";
            sDirPath+= wfd.cFileName;
            sDirPath._Copy_s(lpPath, sDirPath.length(), sDirPath.length());
            lpPath[sDirPath.length()] = '\0';

            //Si el fichero a copia es un directorio
            if(FILE_ATTRIBUTE_DIRECTORY == wfd.dwFileAttributes)
            {
               DeleteDirectory(sDirPath);
               //Se crea el directorio
               RemoveDirectory(
                 lpPath // directory name
               );
            }
            else
            {
               DeleteFile(
                    lpPath // file name
                  );
            }
         } while( FindNextFile( hFind, &wfd ));
         // Cierra el manejador de la busqueda
         FindClose( hFind );
      }
   }
   //----------------------------------------------------------------------------------
    // Indica el progreso en la copia de ficheros
    //----------------------------------------------------------------------------------
/*   static DWORD CopyProgressRoutine(
        LARGE_INTEGER TotalFileSize, // file size
        LARGE_INTEGER TotalBytesTransferred, // bytes transferred
        LARGE_INTEGER StreamSize, // bytes in stream
        LARGE_INTEGER StreamBytesTransferred, // bytes transferred for stream
        DWORD dwStreamNumber, // current stream
        DWORD dwCallbackReason, // callback reason
        HANDLE hSourceFile, // handle to source file
        HANDLE hDestinationFile, // handle to destination file
        LPVOID lpData )// from CopyFileEx
   {
      int nValue = (TotalFileSize.QuadPart / TotalBytesTransferred.QuadPart) * 100;
      m_progressBar1.std.SetValue(nValue);
      return 0;
   }
*/  //----------------------------------------------------------------------------------
    // Pega los ficheros
    //----------------------------------------------------------------------------------
   VOID PasteFiles()
   {
      LPSTR lpFileName = new char[MAX_PATH];      //Nombre del fichero
      LPWSTR lpFileNameW = new wchar_t[MAX_PATH];   //Nombre del fichero caracteres anchos
      string sFileName;
      LPSTR lpOrigen = new char[MAX_PATH] ;
      LPSTR lpDestino = new char[MAX_PATH];
      string sDestino;

      m_text2.SetOpacity(1);
      m_button1.SetOpacity(1);
      m_progressBar1.SetOpacity(1);
      int i = 0;
      if (sSelectedFiles[i] != "\0")
      {
         do{
            //Inicializa la barra de progreso
//            m_progressBar1.SetRange(0,100);
//            m_progressBar1.SetValue(0);

            //Copia el nombre del directorio actual
            sDestino = sDirAct;

            //Se obtiene la posicion de la ultima barra del directorio actual
            size_t pos = sSelectedFiles[i].find_last_of("\\");
            //Extrae el nombre del fichero con la barra
            sFileName = sSelectedFiles[i].substr(pos+1);
            //Copiar el nombre del fichero a un puntero
            sFileName._Copy_s(lpFileName, sFileName.length(),sFileName.length());
             //Añade el final del fichero
            lpFileName[sFileName.length()]='\0';
            //Convierte el nombre del fichero a caracteres anchos
            ::MultiByteToWideChar( CP_ACP, NULL, lpFileName, -1, lpFileNameW, MAX_PATH);
            //Se muestra el nombre en el boton de la barra de progreso
            m_text2.SetText(lpFileNameW);

            //Añade el nombre del fichero al directorio destino
            sDestino+="\\";
            sDestino+=sFileName;
            sSelectedFiles[i]._Copy_s(lpOrigen, sSelectedFiles[i].length(), sSelectedFiles[i].length());
            lpOrigen[sSelectedFiles[i].length()]='\0';
            //Copia el directorio al puntero directorio
            sDestino._Copy_s(lpDestino, sDestino.length(), sDestino.length());
            lpDestino[sDestino.length()]='\0';

            //Si el fichero a copia es un directorio
            if(FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(lpOrigen))
            {
               //Se crea el directorio
               CreateDirectory(
                 lpDestino, // directory name
                 NULL // SD
               );
               CopyDirectory(sDestino, sSelectedFiles[i]);
               if (iManagerOption == CUT)
               RemoveDirectory(lpOrigen);

            }
            else
            {
               if (iManagerOption == COPY)
               {
                  CopyFileEx(
                    lpOrigen, // name of existing file
                    lpDestino, // name of new file
                    NULL,//CopyProgressRoutine, // callback function
                    NULL, // callback parameter
                    NULL, // cancel status
                    NULL
      //              COPY_FILE_FAIL_IF_EXISTS // copy iManagerOptions
                  );
               }
               else if (iManagerOption == CUT)
               {
                  MoveFileWithProgress(
                    lpOrigen, // name of existing file
                    lpDestino, // name of new file
                    NULL, //CopyProgressRoutine, // callback function
                    NULL, // callback parameter
                    MOVEFILE_REPLACE_EXISTING
      //              COPY_FILE_FAIL_IF_EXISTS // copy iManagerOptions
                  );
               }
            }
            i++;
         }while (sSelectedFiles[i] != "\0");
         OpenDevice(sDirAct);
      }

      m_button1.SetOpacity(0);
      m_text2.SetOpacity(0);
      m_progressBar1.SetOpacity(0);
   }
    //----------------------------------------------------------------------------------
    // Borra los ficheros
    //----------------------------------------------------------------------------------
   VOID DeleteFiles()
   {
      LPSTR lpFileName = new char[MAX_PATH];      //Nombre del fichero
      LPWSTR lpFileNameW = new wchar_t[MAX_PATH];   //Nombre del fichero caracteres anchos
      string sFileName;

      for (int i=0; i<m_list2.GetItemCount(); i++)
      {
         if (m_list2.GetItemCheck(i))
         {
            //Inicializa la barra de progreso
//            m_progressBar1.SetRange(0,100);
//            m_progressBar1.SetValue(0);

            //Convierte el nombre del fichero a caracteres
            ::WideCharToMultiByte(CP_ACP,NULL,m_list2.GetText(i),-1,lpFileName,MAX_PATH,NULL,NULL);
            //Añade el nombre del fichero al directorio Actual
            sFileName = sDirAct;
            sFileName+= "\\";
            sFileName+= lpFileName;
            //Copiar el nombre del fichero a un puntero
            sFileName._Copy_s(lpFileName, sFileName.length(),sFileName.length());
             //Añade el final del fichero
            lpFileName[sFileName.length()]='\0';
            //Convierte el nombre del fichero a caracteres anchos
            ::MultiByteToWideChar( CP_ACP, NULL, lpFileName, -1, lpFileNameW, MAX_PATH);
            //Se muestra el nombre en el boton de la barra de progreso
            m_text2.SetText(lpFileNameW);

            //Si el fichero a copia es un directorio
            if(FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(lpFileName))
            {
               DeleteDirectory(sFileName);
               //Se crea el directorio
               RemoveDirectory(
                 lpFileName // directory name
               );
            }
            else
            {
               DeleteFile(
                    lpFileName // file name
                  );
            }
            i++;
         }
      }
   OpenDevice(sDirAct);
   }
    //----------------------------------------------------------------------------------
    // Crea un directorio
    //----------------------------------------------------------------------------------
   VOID CreateDir()
   {

   }
    //----------------------------------------------------------------------------------
    // Carga el fondo de pantalla
    //----------------------------------------------------------------------------------
   VOID CargarFondo()
   {
      // Create event for asynchronous writing
/*      HANDLE hEventComplete = CreateEvent( NULL, FALSE, FALSE, NULL );

      if( hEventComplete == NULL )

      XOVERLAPPED xov = {0};
      xov.hEvent = hEventComplete;

        CHAR szFileName[XCONTENT_MAX_FILENAME_LENGTH];
        WCHAR szDisplayName[XCONTENT_MAX_DISPLAYNAME_LENGTH];

      XCONTENT_DATA contentData = {0};
      strcpy_s( contentData.szFileName, "nxeart" );
      wcscpy_s( contentData.szDisplayName, L"nxeart" );
      contentData.dwContentType = XCONTENTTYPE_PUBLISHER;
      contentData.DeviceID = XCONTENTDEVICE_ANY;

      // Mount the device associated with the display name for writing
         DWORD dwErr = XContentCreate( 0, "usb0:\\Assassins Creed 2", &contentData,
                        XCONTENTFLAG_OPENEXISTING, NULL, NULL, &xov );
         if( dwErr != ERROR_IO_PENDING )
         {
            CloseHandle( hEventComplete );
//            ATG::DebugSpew( "WriteSaveGame: XContentCreate failed.\n" );
//            return dwErr;
         }
         // Wait on hEventComplete handle
         if( XGetOverlappedResult( &xov, NULL, TRUE ) == ERROR_SUCCESS )
         {
            HANDLE hFile = CreateFile( "usb0:\\Assassins Creed 2\nxeart\", GENERIC_READ, 0,
            NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

         if( hFile != INVALID_HANDLE_VALUE )
         {
            // Write dummy data to the file
            CHAR szBuffer[] = "Test save game data.\n";
            DWORD dwWritten;

            if( WriteFile( hFile, ( VOID* )szBuffer, strlen( szBuffer ), &dwWritten, NULL ) == 0 )
            {
               CloseHandle( hFile );
               XContentClose( g_szSaveRoot, &xov );
               XGetOverlappedResult( &xov, NULL, TRUE );
               CloseHandle( hEventComplete );

               ATG::DebugSpew( "WriteSaveGame: WriteFile failed. Error = %08x\n", GetLastError() );
               return GetLastError();
            }

            CloseHandle( hFile );
         }
         else
         {
            ATG::DebugSpew( "WriteSaveGame: CreateFile failed. Error = %08x\n", GetLastError() );
            return GetLastError();
         }
      }

      XContentClose( g_szSaveRoot, &xov );

      // Wait for XCloseContent to complete
      XGetOverlappedResult( &xov, NULL, TRUE );

      CloseHandle( hEventComplete );
*/   }

   VOID CargarFondo2()
   {
      ifstream in;
      stringstream buffer;
      string content;
      string wallpaperHD;
      size_t start, end, length;

      in.open("usb0:\\Assassins Creed 2\\nxeart", ios::in | ios::binary);
      buffer << in.rdbuf();
      content=buffer.str();

      // We search for JFIF signature
      start = content.find("ÖExif");
      // Header of JPEG is 6 caracter & JFIF string, so back to 6 in file
      start -= 5;
      // Because first part of the hd wallpaper is 688144
      end = start + 688144;
      // Calculate the size of the first part
      length = end - start;
      // Extract the first part
      wallpaperHD = content.substr( start, end );
      // The second part start after 8176 dummy, ALWAYS
      start = end + 8176;
      // We search for the end of the JPEG, it's a signature
      end = content.find("ÿÙ", start );
      // Calculate the size of the second part
      length = end - start;
      // Add the second part at the end of the first
      wallpaperHD.append( content.substr( start, end+2 ) );
      ofstream out("file://game:/media/nxebg.jpg");
      out << wallpaperHD;
      out.close();
      m_image1.SetImagePath(L"usb0:\\media\\nxebg.jpg");

   }

   string ByteToString(byte b[]){
      string t="";
      int size = sizeof(b);
      for(int i=0;size;i++) t+=(char)b[i];
      return t;
   }
   byte* StringToByte(string b){
      int size = b.length();
      byte* t = new byte[size];
      for(int i=0;size;i++) t[i]=(char)b[i];
      return t;
   }

public:

    // Define the class. The class name must match the ClassOverride property
    // set for the scene in the UI Authoring tool.
    XUI_IMPLEMENT_CLASS( CMyMainScene, L"MyMainScene", XUI_CLASS_SCENE )
};


//--------------------------------------------------------------------------------------
// Main XUI host class. It is responsible for registering scene classes and provide
// basic initialization, scene loading and rendering capability.
//--------------------------------------------------------------------------------------
class CMyApp : public CXuiModule
{
protected:
    // Override RegisterXuiClasses so that CMyApp can register classes.
    virtual HRESULT RegisterXuiClasses();

    // Override UnregisterXuiClasses so that CMyApp can unregister classes.
    virtual HRESULT UnregisterXuiClasses();
};


//--------------------------------------------------------------------------------------
// Name: RegisterXuiClasses
// Desc: Registers all the scene classes.
//--------------------------------------------------------------------------------------
HRESULT CMyApp::RegisterXuiClasses()
{
    return CMyMainScene::Register();
}


//--------------------------------------------------------------------------------------
// Name: UnregisterXuiClasses
// Desc: Unregisters all the scene classes.
//--------------------------------------------------------------------------------------
HRESULT CMyApp::UnregisterXuiClasses()
{
    CMyMainScene::Unregister();
    return S_OK;
}

//--------------------------------------------------------------------------------------
// Name: main
// Desc: Application entry point.
//--------------------------------------------------------------------------------------
VOID __cdecl main()
{
    // Declare an instance of the XUI framework application.
    CMyApp app;

    // Initialize the application.   
    HRESULT hr = app.Init( XuiD3DXTextureLoader );
    if( FAILED( hr ) )
    {
        OutputDebugString( "Failed intializing application.\n" );
        return;
    }

    // Register a default typeface
    hr = app.RegisterDefaultTypeface( L"Arial Unicode MS", L"file://game:/media/xarialuni.ttf" );
    if( FAILED( hr ) )
    {
        OutputDebugString( "Failed to register default typeface.\n" );
        return;
    }

    // Load the skin file used for the scene.
    app.LoadSkin( L"file://game:/media/simplescene.xzp#Media\\xui\\simple_scene_skin.xur" );

    // Load the scene.
    app.LoadFirstScene( L"file://game:/media/simplescene.xzp#Media\\xui\\", L"simple_scene.xur", NULL );

    // Run the scene.   
    app.Run();

    // Free resources, unregister custom classes, and exit.
    app.Uninit();
}


Saludos.

P.D.: He actualizado el codigo con mis ultimas modificaciones para copiar, cortar, pegar y borrar archivos y directorios.

He cambiado la ruta de los iconos de "media" a "media/icons".
He añadido iconos a las opciones de gestion de archivos.
He modificado la posicion de los iconos, ahora estan a la izquierda del nombre del fichero, para ello hay que modificar el fichero simple_scene_skin.xui. El objeto XuiButton, tiene otro objeto llamado image_presenter, solo hay que cambiarlo a la izquierda del texto y modificar la propiedad "Anchor X" de Right a Left.

Ahora voy a intentar acceder a las imagenes que existen dentro del fichero nxeart, no solo los dos fondos, sino los iconos y el nombre del juego. Si consigo acceder a esto se podria crear una lista de juegos automatica con el icono y fondo de cada juego. Estoy ojeando el ejemplo XContent que parece que estrae el ThumbnailImage de un savegame.

Tengo creada una rutina para mostrar la barra de progreso cuando se copian ficheros, pero necesito crear la funcion delegada, para pasarla como parametro. En el codigo esta comentada "CopyProgressRoutine". Alguien se anima?

Saludos.

ACTUALIZACION:

Gracias a Ski-lleR, he montado el codigo de cargar el fondo, pero tambien extrae el icono y la imagen pequeña. El problema es que no funciona, aunque deveria hacerlo, ya que he comprobado directamente con los ficheros que los datos para su extraccion son correctos y no he modificado el algoritmo que me paso Ski-lleR. Haber si alguien le puede echar un vistazo y ver que puede fallar.

    //----------------------------------------------------------------------------------
    // Carga el fondo de pantalla
    //----------------------------------------------------------------------------------
   VOID CargarFondo()
   {
      LPWSTR lpGameNameW = new wchar_t[MAX_PATH];   //Nombre del fichero caracteres anchos

      string sNxeartFile;
      char cNxeartFile[MAX_PATH];
      char cGameImagesFile[MAX_PATH];
      sNxeartFile= sDirAct;
      sNxeartFile+= "\\nxeart";

      sNxeartFile._Copy_s(cNxeartFile, sNxeartFile.length(), sNxeartFile.length());
      cNxeartFile[sNxeartFile.length()]='\0';

      // Ouverture du fichier nxeart pour traitement
      ifstream in;
      stringstream out;
      string content;
      size_t start, end, length;
      
      in.open(cNxeartFile, ios::in | ios::binary);
      out << in.rdbuf();

      // On stock le fichier entier en mémoire
      content=out.str();

      // On extrait le nom
      string gameName = content.substr( 5778, 40 );
      for (size_t i = 0; i < gameName.length(); i++)
      {
      if (gameName.at(i) == 0x00)
         gameName.erase(i, 1);
      }
      char *cGameName = new char[gameName.length()+1];
      gameName._Copy_s(cGameName, gameName.length(), gameName.length());
      cGameName[gameName.length()] = '/0';

      // On extrait l'icone du jeu
      start = content.find("PNG");
      start -= 1;
      end = content.find("IEND");
      end += 7;
      length = end - start;
      string icon = content.substr( start, length );

      start = content.find("JFIF");
      start -= 6;
      end = start + 688128;
      length = end - start;
      string wallpaperHD = content.substr( start, length );
      // Deuxième partie de l'image
      start = end + 8192;
      end = content.find("ÿÙ", start );
      length = end - start;
      // On colle les 2 bouts
      wallpaperHD.append( content.substr( start, length+2 ) );
      
/*      // On extrait l'image utiliser pour le preview
      start = content.find("JFIF", end);
      start -= 6;
      end = content.find("ÿÙ", start );
      end += 5;
      end = content.find("ÿÙ", end );
      end += 5;
      end = content.find("ÿÙ", end );
      length = end - start;
      string logo = content.substr( start, length+2 );
*/
      //Se crea el directorio
      CreateDirectory(
        "file://game:/media/gameimages", // directory name
        NULL // SD
      );

      ofstream out2;
//      sprintf_s( cGameImagesFile,"file://game:/media/gameimages/%s_icon.jpg", cGameName );
      sprintf_s( cGameImagesFile,"usb0:\\media\\gameimages\\%s_icon.jpg", cGameName );
      out2.open(cGameImagesFile, ios::out | ios::binary);
      out2.write(icon.c_str(), icon.length());
      out2.close();
/*
      sprintf_s( cGameImagesFile,"file://game:/media/gameimages/%s_logo.jpg", cGameName );
      sprintf_s( cGameImagesFile,"usb0:\\media\\gameimages\\%s_logo.jpg", cGameName );
      out2.open(cGameImagesFile, ios::out | ios::binary);
      out2.write(logo.c_str(), logo.length());
      out2.close();
*/
//         sprintf_s( cGameImagesFile,"file://game:/media/gameimages/%s_wallpaperHD.jpg", cGameName );
         sprintf_s( cGameImagesFile,"usb0:\\media\\gameimages\\%s_wallpaperHD.jpg", cGameName );
      out2.open(cGameImagesFile, ios::out | ios::binary);
      out2.write(wallpaperHD.c_str(), wallpaperHD.length());
      out2.close();

      ::MultiByteToWideChar( CP_ACP, NULL, cGameName, -1, lpGameNameW, MAX_PATH);
      m_image1.SetImagePath(lpGameNameW);

   }
para poder programar necesito instalar el sdk full? o con el minimo ya ai suficiente?
es porque aunque tenga el 2005 instalado i teoricamente actualizado con el sp1( aplique la actualizacion, pero no beo ningun lugar que salga el sp1)
tambien tengo win 7 64 bits.


gracias
Cuando instalas el SDK, si no tienes el Visual Studio 2005 con el SP1 no te deja instalarlo full, la unica diferencia es, que la version full te instala los ejemplos.

Saludos.

P.D.: Un poco de ayuda.

http://www.xbdev.net/index.php
Para empezar, Recomiendo la lectura del hilo:

http://forums.xbox-scene.com/index.php?showtopic=701729&st=0

y de la wiki:

http://dev360.wikia.com/wiki/XBox360_Homebrew_Development_Wiki

Por cierto, he hecho una propuesta en el siguiente hilo, a ver q os parece por si no lo habéis visto: http://www.elotrolado.net/hilo_propuesta-de-programacion-de-aplicacion-xex_1375022
Ahora me ha picado un poco el gusanillo de programar algo y tengo un par de dudas:
¿Se puede utilizar cualquier librería de C++, o tienen que ser específicas para la Xbox?
¿Cómo se realiza el proceso de compilado de un xex?
98 respuestas
1, 2