website logo
Auteur
avatar
thellier

Forum » » Création-Développement » » Ou sont les sources de SuperTuxKart pour Amiga?


Posté : 18-09-2012 09:48 icone du post

Hello

>J'avoue ne pas avoir compris ce que fait LibSnooper
Tu peut snooper n'importe quelle library (dont tu a les !include!) ça fait afficher les appels de fonctions (+ le contenu des registres = les parametres de la fonction en 68k) au fur et à mesure du déroulement d'un prog
c utile pour voir comment fait pour bien (mal) marcher un prog dont tu as pas les sources et comment il utilise efficacement (affreusement) une library

Evidemment en OS4 avec les interfaces on peut pas faire pareil (patcher une .library quelconque)
Mais on pourrais patcher une .library en particulier (ici minigl)
ainsi on verrai les appels de fonctions GL au fur et à mesure du déroulement d'un prog

Là j'ai pas le temps de le faire : je suis dans mon Microbe3D
mais voilà l'idée : je me suis basé sur mon prog (inutile) PatchWarp3D
Ici en exemple patchage de juste W3D_BindTexture --> faudrait genérer
les patch pour toutes les fonctions de minigl : à l'occasion je les ferai dans Excel

Alain


/*==========================================================================* /
/* SnoopWarp3D - Alain THELLIER - 2012 - Paris - FRANCE */
/*==========================================================================* /
#define __USE_INLINE__
#define __USE_BASEHOOK__
#define __USE_OLD_TIMEVAL__
/*==========================================================================* /
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
#!include!
/*==========================================================================* /
struct Library *AslBase =NULL;
struct Library *Warp3DBase =NULL;
struct IntuitionBase *IntuitionBase =NULL;

struct Warp3DIFace* IWarp3D =NULL;
struct IntuitionIFace* IIntuition =NULL;
struct AslIFace* IAsl =NULL;
/*=========================================================================== ===========*/
typedef ULONG (*HOOK_W3D_BindTexture) (void *Self,W3D_Context *context, ULONG tmu, W3D_Texture* texture);
/*==========================================================================* /
APTR Ptr_W3D_BindTexture;
ULONG Calls_W3D_BindTexture=0;
HOOK_W3D_BindTexture True_W3D_BindTexture;
/*==========================================================================* /
#define PATCH(old,new,ptr) ptr=SetMethod((struct Interface *)IWarp3D, offsetof(struct Warp3DIFace, old) ,(APTR)new); VAR(ptr);
/*==========================================================================* /
ULONG Calls_All=0;
/*==========================================================================* /
#define VULONG(var) {printf(" " #var "=" ); printf("%ld\n", ((ULONG)var) );}
#define VFLOAT(var) {printf(" " #var "=<%2.2f> ",var); }
#define VNAME(var) {printf(" " #var "=<%s> ",var); }
#define VFUNC(var) {printf(" " #var "=<%s> ",var); }
#define VCHAR(var) {printf(" " #var "='%c' ",var); }
#define VAPTR(var) {if(var!=0) {printf(" " #var "=" ); printf("%ld\n", ((ULONG)var) );} else {printf(" " #var "=NULL\n");}}
#define VBOOL(var) {if(var==TRUE) printf(" " #var "=TRUE\n"); else printf(" " #var "=FALSE\n");}
/*==========================================================================* /
ULONG Patched_W3D_BindTexture(W3D_Context* context, ULONG tmu, W3D_Texture *texture)
{
ULONG result;

VFUNC(W3D_BindTexture) VAPTR(context) VULONG(tmu) VAPTR(texture)
result=True_W3D_BindTexture(IWarp3D,context,tmu,texture);
Calls_W3D_BindTexture++;
Calls_All++;
return(result);
}
/*==========================================================================* /
void PatchLib(void)
{
PATCH(W3D_BindTexture,Patched_W3D_BindTexture,True_W3D_BindTexture);
}
/*==========================================================================* /
void RestaureLib(void)
{
PATCH(W3D_BindTexture,True_W3D_BindTexture,Ptr_W3D_BindTexture); VULONG(Calls_W3D_BindTexture);
}
/*=========================================================================== =======*/
BOOL OpenAmigaLibraries(void)
{
#define LIBOPEN(libbase,name,version) libbase =(void*)OpenLibrary(#name,version); if(libbase==NULL) return(FALSE);
#define LIBOPEN4(interface,libbase) interface=(void*)GetInterface((struct Library *)libbase, "main", 1, NULL); if(interface==NULL) return(FALSE);


LIBOPEN(AslBase,asl.library,37L)
LIBOPEN(IntuitionBase,intuition.library,0L)
LIBOPEN(Warp3DBase,Warp3D.library,5L)

LIBOPEN4(IExec,SysBase)

LIBOPEN4(IAsl,AslBase)
LIBOPEN4(IIntuition,IntuitionBase)
LIBOPEN4(IWarp3D,Warp3DBase)

return(TRUE);
}
/*=========================================================================== ===========*/
void CloseAmigaLibraries()
{
#define LIBCLOSE(libbase) if(libbase !=NULL) { CloseLibrary((struct Library *)libbase ); libbase=NULL; }
#define LIBCLOSE4(interface) if(interface!=NULL) { DropInterface((struct Interface*)interface ); interface=NULL; }


LIBCLOSE4(IAsl)
LIBCLOSE4(IIntuition)
LIBCLOSE4(IWarp3D)

LIBCLOSE(AslBase)
LIBCLOSE(IntuitionBase)
LIBCLOSE(Warp3DBase)

}
/*==========================================================================* /
int main(int argc, char **argv)
{
if (OpenAmigaLibraries()==FALSE)
{printf("Cant open xxx.library\n"); return FALSE;}

printf((void*)"Old functions pointers:\n");
PatchLib(void)
printf((void*)"Dont close this window...\n");
OSAlert("Library patched (Ctrl C=exit)");

Wait(SIGBREAKF_CTRL_C);

RestaureLib(void)

if(Calls_All==0)
printf((void*)"Library was never called ...\n");
else
printf((void*)"Library was called %ld times \n",Calls_All);
OSAlert("Library restaured");

CloseAmigaLibraries();
exit(0);
}
/*==========================================================================* /





Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=1369&forum=14