Exemple #1
0
static void ProcFile( FILE *fp )
/******************************/
{
    byte        hdr[ 3 ];
    unsigned_16 page_len;
    unsigned_32 offset;

    page_len = 0;
    RecBuff = NULL;
    RecMaxLen = 0;
    for(;;) {
        offset = ftell( fp );
        if( fread( hdr, 1, 3, fp ) != 3 )
            break;
        RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 );
        ResizeBuff( RecLen );
        RecPtr = RecBuff;
        if( fread( RecBuff, RecLen, 1, fp ) == 0 )
            break;
        RecLen--;
        isMS386 = hdr[ 0 ] & 1;
        switch( hdr[ 0 ] & ~1 ) {
        case CMD_MODEND:
            if( page_len != 0 ) {
                offset = ftell( fp );
                offset = page_len - offset % page_len;
                if( offset != page_len ) {
                    fseek( fp, offset, SEEK_CUR );
                }
            }
            break;
        case CMD_PUBDEF:
            if( ( GetIndex() | GetIndex() ) == 0 )
                GetUInt();
            while( ! EndRec() ) {
                GetName();
                *RecPtr = 0;
                printf( "%s\n", NamePtr );
                GetOffset();
                GetIndex();
            }
            break;
        case LIB_HEADER_REC:
            if( isMS386 ) {
                fseek( fp, 0L, SEEK_END );
                page_len = 0;
            } else {
                page_len = RecLen + 4;
            }
            break;
        default:
            break;
        }
    }
    free( RecBuff );
}
Exemple #2
0
void ProcFile( FILE *fp, bool is_intel )
/**************************************/
{
    byte        cksum;
    byte        hdr[ 3 ];
    unsigned_16 page_len;
    unsigned_32 offset;
    const char  *recname;
    unsigned_32 total_padding;
    int         raw_dump;
    int         i;
    int         first;

    IsPharLap = FALSE;
    IsMS386 = FALSE;
    IsIntel = is_intel;
    RecNum = 0;
    page_len = 0;
    RecBuff = NULL;
    RecMaxLen = 0;
    total_padding = 0;
    Lnames = NULL;
    Xnames = NULL;
    Segdefs = NULL;
    Grpdefs = NULL;
    first = 1;
    for(;;) {
        raw_dump = DumpRaw;
        offset = ftell( fp );
        if( fread( hdr, 1, 3, fp ) != 3 ) break;
        cksum  = hdr[ 0 ];
        cksum += hdr[ 1 ];
        cksum += hdr[ 2 ];
        RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 );
        ResizeBuff( RecLen );
        RecPtr = RecBuff;
        if( fread( RecBuff, RecLen, 1, fp ) == 0 ) {
            break;
        }
        cksum += checkSumBuff();
        IsMS386 = hdr[ 0 ] & 1;
        if( IsMS386 ) {
            IsIntel = FALSE;
        }
        no_disp = ( rec_count == 0 ) ? FALSE : TRUE;
        for( i = 0; i < rec_count; i++ ) {
            if( rec_type[ i ] == ( hdr[ 0 ] & ~1 )) {
                no_disp = FALSE;
                break;
            }
        }
        recname = RecNumberToName( hdr[ 0 ] );
        cksum = -( cksum - RecBuff[ RecLen - 1 ] );
        Output( CRLF "%s%s(%2) recnum:%u, offset:%X, len:%x, chksum:%b(%2)" CRLF,
            recname, IsMS386 ? "386" : "", hdr[ 0 ], ++RecNum, offset,
            RecLen, RecBuff[ RecLen - 1 ], cksum );
        RecLen--;
        if( setjmp( BailOutJmp ) == 0 ) {
            switch( hdr[ 0 ] & ~1 ) {
            case CMD_RHEADR:
                ProcRHeadr();
                break;
            case CMD_ENDREC:
                ProcEndRec();
                break;
            case CMD_THEADR:
                ProcTHeadr( first );
                first = 0;
                break;
            case CMD_LHEADR:
                ProcLHeadr();
                break;
            case CMD_COMENT:
                ProcComent();
                break;
            case CMD_MODEND:
                ProcModEnd();
                if( page_len != 0 ) {
                    offset = ftell( fp );
                    offset = page_len - offset % page_len;
                    if( offset != page_len ) {
                        total_padding += offset;
                        fseek( fp, offset, SEEK_CUR );
                    }
                }
                first = 1;
                break;
            case CMD_STATIC_EXTDEF:
                /* fall through */
            case CMD_EXTDEF:
                ProcExtNames();
                break;
            case CMD_STATIC_PUBDEF:
                /* fall through */
            case CMD_PUBDEF:
                ProcPubDefs();
                break;
            case CMD_LOCSYM:
                ProcLocSyms();
                break;
            case CMD_LINNUM:
                ProcLinNums();
                break;
            case CMD_LLNAME:
                /* fall through */
            case CMD_LNAMES:
                ProcLNames( &Nameindex );
                break;
            case CMD_SEGDEF:
                ProcSegDefs();
                break;
            case CMD_GRPDEF:
                ProcGrpDef();
                break;
            case CMD_FIXUP:
                ProcFixup();
                break;
            case CMD_LEDATA:
                ProcLedata();
                break;
            case CMD_LIDATA:
                ProcLidata();
                break;
            case CMD_LIBNAM:
                ProcNames( &Libindex );
                break;
            case CMD_STATIC_COMDEF:
                /* fall through */
            case CMD_COMDEF:
                ProcComDef();
                break;
            case CMD_BAKPAT:
                ProcBackPat();
                break;
            case CMD_CEXTDF:
                ProcComExtDef();
                break;
            case CMD_COMDAT:
                ProcComDat();
                break;
            case CMD_LINSYM:
                ProcLineSym();
                break;
            case CMD_ALIAS:
                ProcAlias();
                break;
            case CMD_NBKPAT:
                ProcNameBackPat();
                break;
            case CMD_VERNUM:
                ProcVerNum();
                break;
            case CMD_VENDEXT:
                ProcVendExt();
                break;
            case LIB_HEADER_REC:
                if( hdr[ 0 ] & 1 ) {
                    /* LIB_TRAILER_REC */
                    ProcLibTrailer( fp );
                    fseek( fp, 0L, SEEK_END );
                    page_len = 0;
                } else {
                    page_len = RecLen + 4;
                    ProcLibHeader();
                }
                break;
            default:
                if( !raw_dump ) {
                    OutputData( 0L, 0L );
                }
                break;
            }
        } else {
            /* something bailed out... */
            if( raw_dump ) {
                Output( INDENT "Error at offset %x" CRLF, (unsigned_32)(pointer_int)RecOffset );
            } else if( !EndRec() ) {
                Output( INDENT "Remainder of record follows:" CRLF );
                OutputData( (unsigned_32)RecOffset(), 0L );
            } else {
                Output( INDENT "End of record" CRLF );
            }
        }
        if( raw_dump ) {
            RecPtr = RecBuff;
            Output(
"====================RAW DUMP==============================================="
                CRLF );
            OutputData( 0L, 0L );
            Output(
"====================RAW DUMP==============================================="
                CRLF );
        }
    }
    if( total_padding > 0 ) {
        Output( CRLF "total padding=%X" CRLF, total_padding );
    }
    if( TranslateIndex) {
        PrintNames();
    }
    FreeGrpdefs();
    FreeSegdefs();
    FreeLnames();
    FreeXnames();
    free( RecBuff );
}
Exemple #3
0
static void ProcFileModRef( FILE *fp )
/************************************/
{
    byte        hdr[ 3 ];
    unsigned_16 page_len;
    unsigned_32 offset;
    char        *module_name;

    page_len = 0;
    RecBuff = NULL;
    RecMaxLen = 0;
    module_name = NULL;
    for(;;) {
        offset = ftell( fp );
        if( fread( hdr, 1, 3, fp ) != 3 )
            break;
        RecLen = hdr[ 1 ] | ( hdr[ 2 ] << 8 );
        ResizeBuff( RecLen );
        RecPtr = RecBuff;
        if( fread( RecBuff, RecLen, 1, fp ) == 0 )
            break;
        RecLen--;
        isMS386 = hdr[ 0 ] & 1;
        switch( hdr[ 0 ] & ~1 ) {
        case CMD_THEADR:
            if( module_name != NULL )
                free( module_name );
            GetName();
            *RecPtr = 0;
            module_name = malloc( strlen( (char *)NamePtr ) + 1 );
            strcpy( module_name, (char *)NamePtr );
            break;
        case CMD_MODEND:
            if( module_name != NULL )
                free( module_name );
            module_name = NULL;
            if( page_len != 0 ) {
                offset = ftell( fp );
                offset = page_len - offset % page_len;
                if( offset != page_len ) {
                    fseek( fp, offset, SEEK_CUR );
                }
            }
            break;
        case CMD_PUBDEF:
            if( ( GetIndex() | GetIndex() ) == 0 )
                GetUInt();
            while( ! EndRec() ) {
                GetName();
                *RecPtr = 0;
                if( SymbolExists( pubdef_tab, (char *)NamePtr ) != 0 ) {
                    if( SymbolExists( extdef_tab, module_name ) == 0 ) {
                        AddSymbol( extdef_tab, module_name, NULL );
                        printf( "%s\n", module_name );
                    }
                }
                GetOffset();
                GetIndex();
            }
            break;
        case LIB_HEADER_REC:
            if( isMS386 ) {
                fseek( fp, 0L, SEEK_END );
                page_len = 0;
            } else {
                page_len = RecLen + 4;
            }
            break;
        default:
            break;
        }
    }
    free( RecBuff );
}