fxestart.c/******************************************************************************
Informations projet:
Projet:
Version: 1.00
Plateforme: GP 32
Copyright: DNDD.INC
Date: 12/01/2004
Informations fichier:
Nom: fxestart.c
Descripion: Lancement des FXE, GXB et AXF, GXE à inclure
Informations auteur:
Auteur: DOUALOT Nicolas
E-Mail: slubman@laposte.net
site: http://membres.lycos.fr
******************************************************************************/
/**************************************************************************************/
/* L'API GP32 */
/**************************************************************************************/
#include "gpstdlib.h"
#include "gpstdio.h"
/**************************************************************************************/
/* Les constantes */
/**************************************************************************************/
#define FXE_TAG1 "fxe "
#define FXE_TAG2 "FXE "
#define FXE_HEADER_SIZE (4+4+4+4+4+32+32+16+1024)
/**************************************************************************************/
/* Les fonctions */
/**************************************************************************************/
static void fix_key(long klen, unsigned char *key )
{
long n = 0;
while (n < klen)
{
key[n++] ^= 0xff;
}
}
static void decrypt_buffer(long klen, const unsigned char *key, long blen, unsigned char *buf )
{
long n = 0;
while (n < blen)
{
unsigned char c = buf[n];
buf[n] = c ^ key[n % klen];
n++;
}
}
void launch_gxb_from_mem(unsigned char *gxb, char *where)
{
GpAppExecute(gxb, where);
}
// Lancement d'un GXB stocké quelque part en RAM (pour mon firmware ;-)
void launch_gxb_from_int(unsigned char *gxb, unsigned long length, char *where)
{
unsigned char *data=NULL;
int key;
data=gm_malloc(length+4);
memcpy(data+4, gxb, length);
// On lance le fichier
launch_gxb_from_mem(data, where);
}
void launch_gxb(char *chemin, char *where)
{
unsigned long i, size;
unsigned char *data=NULL;
F_HANDLE file;
// On ouvre le fichier GXB
if (GpFileOpen(chemin, OPEN_R, &file)!=SM_OK)
{
return;
}
// On récupère la taille du fichier
GpFileGetSize(chemin, &size);
// On ajooute 4 octets bidons à l'avant du fichier (ne marche pas sinon :-(
data=gm_malloc(size+4);
GpFileRead(file, data+4, size, &i);
// On lance le fichier
launch_gxb_from_mem(data, where);
}
void launch_fxe(char* chemin, char *where)
{
char buff[256], tampon[2048];
F_HANDLE file;
unsigned long i, data_size, size, size_rl, info_size, key_size;
unsigned char *key=NULL, *data=NULL;
unsigned char fix[]={0xe,0x00,0x00,0xea,0x00,0x00,0x00,0x0c,0xe8,0x02,0x00,0x0c,0xe8,0x02,0x00,0x0c};
// On ouvre le fichier
if (GpFileOpen(chemin, OPEN_R, &file)!=SM_OK)
{
return;
}
// La signature
GpFileRead(file, buff, 4, &i);
buff[4]=0;
if (gm_compare(buff, FXE_TAG1) && gm_compare(buff, FXE_TAG2))
{
return;
}
// La taille totale du fichier
GpFileRead(file, &size, 4, &i);
size-=FXE_HEADER_SIZE;
// La taille des infos
GpFileRead(file, &info_size, 4, &i);
// Le nom dans l'explorateur
GpFileRead(file, &buff, 32, &i);
buff[32]=0;
// L'auteur
GpFileRead(file, &buff, 32, &i);
buff[32]=0;
// La partie réservée
GpFileRead(file, &buff, 16, &i);
buff[16]=0;
// L'icone
GpFileRead(file, &tampon, 1024, &i);
// La taille de l'exécutable
GpFileRead(file, &data_size, 4, &i);
// La taille de la clé
GpFileRead(file, &key_size, 4, &i);
// Lecture de la clé
key=gm_malloc(key_size);
GpFileRead(file, key, 4, &i);
// On lit les données
GpFileGetSize(chemin, &size_rl);
size_rl-=FXE_HEADER_SIZE;
if (size_rl==size)
{
// On "répare" le FX3
}
else
{
data=gm_malloc(data_size+key_size);
GpFileRead(file, data+key_size, data_size, &i);
gm_memcpy(data, key, key_size);
}
// On ferme le fichier
GpFileClose(file);
// on "fixe" la clé
fix_key(key_size, key);
// on décrypte les données
decrypt_buffer(key_size, key, size, data);
// On lance le programme
launch_gxb_from_mem(data, wh
/******************************************************************************
Informations projet:
Projet:
Version: 1.00
Plateforme: GP 32
Copyright: DNDD.INC
Date: 12/01/2004
Informations fichier:
Nom: fxestart.h
Descripion: Interface de lancement des FXE, GXB et AXF, GXE à inclure
Informations auteur:
Auteur: DOUALOT Nicolas
E-Mail: slubman@laposte.net
site: http://membres.lycos.fr
******************************************************************************/
#ifndef _FXESTART_H_
#define _FXESTART_H_
/******************************************************************************
launch_fxe(char* chemin, char *where)
chemin: chemin vers le fichier .FXE
where: valeur que renverras GpAppPathGet une fois le programme lancé
retour:
rien
******************************************************************************/
extern void launch_fxe(char* chemin, char *where);
/******************************************************************************
launch_gxb(char* chemin, char *where)
chemin: chemin vers le fichier .gxb
where: valeur que renverras GpAppPathGet une fois le programme lancé
retour:
rien
******************************************************************************/
extern void launch_gxb(char *chemin, char *where);
/******************************************************************************
launch_gxb_from_mem(unsigned char* gxb, char *where)
gxb: debut du buffer contenant le GXB
where: valeur que renverras GpAppPathGet une fois le programme lancé
retour:
rien
******************************************************************************/
extern void launch_gxb_from_mem(unsigned char *gxb, char *where);
/******************************************************************************
launch_gxb_from_int(unsigned char* gxb, char *where)
gxb: debut du buffer contenant le GXB
where: valeur que renverras GpAppPathGet une fois le programme lancé
Note: Cette fonction ne s'uilise que si le GXB est dans le corp du
programme le lançant ;-)
retour:
rien
******************************************************************************/
extern void launch_gxb_from_int(unsigned char *gxb, unsigned long length, char *where);
#endif