update to ida 7.6, add builds
This commit is contained in:
88
idasdk76/ldr/aif/aifcmn.cpp
Normal file
88
idasdk76/ldr/aif/aifcmn.cpp
Normal file
@@ -0,0 +1,88 @@
|
||||
|
||||
static const uint32 magic1[] = { ZERO_CODE1 };
|
||||
static const uint32 magic2[] = { ZERO_CODE2 };
|
||||
static const uint32 *const magics[] = { magic1, magic2 };
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
static void swap_header(aif_header_t *hd)
|
||||
{
|
||||
uint32 *ptr = (uint32 *)hd;
|
||||
const int size = sizeof(aif_header_t) / sizeof(uint32);
|
||||
for ( size_t i=0; i < size; i++, ptr++ )
|
||||
*ptr = swap32(*ptr);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// 0-failed, 1-little endian, 2-big endian
|
||||
static int match_zero_code(aif_header_t *hd)
|
||||
{
|
||||
int mostfirst = 0;
|
||||
for ( int i=0; i < qnumber(magics); i++ )
|
||||
{
|
||||
if ( memcmp(hd->zero_code, magics[i], sizeof(hd->zero_code)) == 0 )
|
||||
return mostfirst+1;
|
||||
swap_header(hd);
|
||||
mostfirst = !mostfirst;
|
||||
if ( memcmp(hd->zero_code, magics[i], sizeof(hd->zero_code)) == 0 )
|
||||
return mostfirst+1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
//
|
||||
// check input file format. if recognized, then return 1
|
||||
// otherwise return 0
|
||||
//
|
||||
bool is_aif_file(linput_t *li)
|
||||
{
|
||||
aif_header_t hd;
|
||||
qlseek(li, 0);
|
||||
if ( qlread(li, &hd, sizeof(hd)) != sizeof(hd) )
|
||||
return false;
|
||||
return match_zero_code(&hd) != 0;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
static void swap_section(section_t *s)
|
||||
{
|
||||
s->codestart = swap32(s->codestart);
|
||||
s->datastart = swap32(s->datastart);
|
||||
s->codesize = swap32(s->codesize);
|
||||
s->datasize = swap32(s->datasize);
|
||||
s->fileinfo = swap32(s->fileinfo);
|
||||
s->debugsize = swap32(s->debugsize);
|
||||
s->name = swap32(s->name);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
static void swap_dsym(dsym_t *s)
|
||||
{
|
||||
s->sym = swap32(s->sym);
|
||||
s->value = swap32(s->value);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// returns true - debug info with pascal symbols
|
||||
static bool swap_symbols(dsym_t *ds, char *str, uchar *end, size_t nsyms)
|
||||
{
|
||||
int npascal = 0; // number of pascal strings
|
||||
int nc = 0; // number of c strings
|
||||
for ( int i=0; i < nsyms; i++,ds++ )
|
||||
{
|
||||
if ( is_mf() )
|
||||
swap_dsym(ds);
|
||||
if ( ds->sym & ASD_16BITSYM )
|
||||
continue;
|
||||
size_t off = size_t(ds->sym & ASD_SYMOFF);
|
||||
char *name = str + off;
|
||||
if ( name >= (char *)end )
|
||||
continue;
|
||||
if ( name[0] == strlen(name)-1 )
|
||||
npascal++;
|
||||
else
|
||||
nc++;
|
||||
}
|
||||
return npascal > nc;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user