WinUAE/prowizard/rippers/GNUPacker12.c
2010-02-22 21:46:52 +02:00

126 lines
3.8 KiB
C

/* testGNUPacker12() */
/* Rip_GNUPacker12() */
#include "globals.h"
#include "extern.h"
short testGNUPacker12 ( void )
{
PW_Start_Address = PW_i;
if ( (in_data[PW_Start_Address+16] != 0x22 ) ||
(in_data[PW_Start_Address+17] != 0x48 ) ||
(in_data[PW_Start_Address+18] != 0xD3 ) ||
(in_data[PW_Start_Address+19] != 0xED ) ||
(in_data[PW_Start_Address+20] != 0x00 ) ||
(in_data[PW_Start_Address+21] != 0x08 ) ||
(in_data[PW_Start_Address+22] != 0x30 ) ||
(in_data[PW_Start_Address+23] != 0xDE ) ||
(in_data[PW_Start_Address+24] != 0xB1 ) ||
(in_data[PW_Start_Address+25] != 0xC9 ) ||
(in_data[PW_Start_Address+26] != 0x66 ) ||
(in_data[PW_Start_Address+27] != 0x00 ) ||
(in_data[PW_Start_Address+28] != 0xFF ) ||
(in_data[PW_Start_Address+29] != 0xFA ) ||
(in_data[PW_Start_Address+30] != 0x20 ) ||
(in_data[PW_Start_Address+31] != 0x6D ) )
{
/* should be enough :))) */
/*printf ( "#2 Start:%ld\n" , PW_Start_Address );*/
return BAD;
}
/* packed size */
PW_l = ( (in_data[PW_Start_Address+0x240]*256*256*256) +
(in_data[PW_Start_Address+0x241]*256*256) +
(in_data[PW_Start_Address+0x242]*256) +
in_data[PW_Start_Address+0x243] );
PW_l += 0x274;
if ( PW_i >= 32 )
{
if ( (in_data[PW_Start_Address-32] != 0x00 ) ||
(in_data[PW_Start_Address-31] != 0x00 ) ||
(in_data[PW_Start_Address-30] != 0x03 ) ||
(in_data[PW_Start_Address-29] != 0xF3 ) ||
(in_data[PW_Start_Address-28] != 0x00 ) ||
(in_data[PW_Start_Address-27] != 0x00 ) ||
(in_data[PW_Start_Address-26] != 0x00 ) ||
(in_data[PW_Start_Address-25] != 0x00 ) ||
(in_data[PW_Start_Address-24] != 0x00 ) ||
(in_data[PW_Start_Address-23] != 0x00 ) ||
(in_data[PW_Start_Address-22] != 0x00 ) ||
(in_data[PW_Start_Address-21] != 0x01 ) ||
(in_data[PW_Start_Address-20] != 0x00 ) ||
(in_data[PW_Start_Address-19] != 0x00 ) ||
(in_data[PW_Start_Address-19] != 0x00 ) ||
(in_data[PW_Start_Address-17] != 0x00 ) )
{
Amiga_EXE_Header = BAD;
}
else
Amiga_EXE_Header = GOOD;
}
else
Amiga_EXE_Header = BAD;
return GOOD;
/* PW_l is the size of the pack */
}
void Rip_GNUPacker12 ( void )
{
/* PW_l is still the whole size */
Uchar * Amiga_EXE_Header_Block;
Uchar * Whatever;
OutputSize = PW_l;
CONVERT = BAD;
if ( Amiga_EXE_Header == BAD )
{
OutputSize -= 32;
Amiga_EXE_Header_Block = (Uchar *) malloc ( 32 );
BZERO ( Amiga_EXE_Header_Block , 32 );
Amiga_EXE_Header_Block[2] = Amiga_EXE_Header_Block[26] = 0x03;
Amiga_EXE_Header_Block[3] = 0xF3;
Amiga_EXE_Header_Block[11] = 0x01;
Amiga_EXE_Header_Block[27] = 0xE9;
/* WARNING !!! WORKS ONLY ON PC !!! */
/* 68k machines code : c1 = *(Whatever+2); */
/* 68k machines code : c2 = *(Whatever+3); */
PW_j = PW_l - 36;
PW_j /= 4;
Whatever = (Uchar *) &PW_j;
Amiga_EXE_Header_Block[20] = Amiga_EXE_Header_Block[28] = *(Whatever+3);
Amiga_EXE_Header_Block[21] = Amiga_EXE_Header_Block[29] = *(Whatever+2);
Amiga_EXE_Header_Block[22] = Amiga_EXE_Header_Block[30] = *(Whatever+1);
Amiga_EXE_Header_Block[23] = Amiga_EXE_Header_Block[31] = *Whatever;
in_data[PW_Start_Address+OutputSize-4] = 0x00;
in_data[PW_Start_Address+OutputSize-3] = 0x00;
in_data[PW_Start_Address+OutputSize-2] = 0x03;
in_data[PW_Start_Address+OutputSize-1] = 0xF2;
Save_Rip_Special ( "GNU Packer 1.2 Exe-file", GNUPacker12, Amiga_EXE_Header_Block , 32 );
free ( Amiga_EXE_Header_Block );
}
else
{
PW_Start_Address -= 32;
Save_Rip ( "GNU Packer 1.2 Exe-file", GNUPacker12 );
}
if ( Save_Status == GOOD )
PW_i += 32;
}