os2exe.c

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 479 行 · 第 1/2 页

C
479
字号
    }
    if( flag & OSF_IS_PROT_DLL ) {
        Wdputs( " | PROTDLL" );
    }
    if( flag & OSF_INTERNAL_FIXUPS_DONE ) {
        Wdputs( " | NO_INT_FIXUPS" );
    }
    if( flag & OSF_EXTERNAL_FIXUPS_DONE ) {
        Wdputs( " | NO_EXT_FIXUPS" );
    }
    if( flag & OSF_LINK_ERROR ) {
        Wdputs( " | LINKERRORSDETECTED" );
    }
    switch( flag & OS2_COMPATIBILITY_MASK ) {
    case OSF_NOT_PM_COMPATIBLE:
        Wdputs( " | NOTWINDOWCOMPAT" );
        break;
    case OSF_PM_COMPATIBLE:
        Wdputs( " | WINDOWCOMPAT" );
        break;
    case OSF_PM_APP:
        Wdputs( " | WINDOWAPI" );
        break;
    }
    if( flag & 0x80000 ) {
        Wdputs( " | MPUNSAFE" );
    }
    Wdputslc( "\n" );
    Wdputslc( "\n" );
}


/*
 * Dump the New Executable Header, if any.
 */
bool Dmp_os2_head( void )
/***********************/
{
    Wlseek( New_exe_off );
    Wread( &Os2_head, sizeof( struct os2_exe_header ) );
    if( Os2_head.signature != OS2_SIGNATURE_WORD ) {
        return( 0 );
    }
    if( Os2_head.align == 0 ) {
        Os2_head.align = 9;
    }
    Banner( "New EXE Header (OS/2 or Windows)" );
    Wdputs( "file offset = " );
    Puthex( New_exe_off, 8 );
    Wdputslc( "H\n" );
    Wdputslc( "\n" );
    Dump_header( (char *)&Os2_head.version, os2_exe_msg );
    dmp_mod_flag_ne( Os2_head.info, Os2_head.target );
    Dmp_seg_tab();
    Dmp_resrc_tab();
    Dmp_ne_tbls();
    if( Options_dmp & OS2_SEG_DMP ) {
        Dmp_segments();
    }
    if( Int_seg_tab != NULL ) {
        free( Int_seg_tab );
    }
    return( 1 );
}

/*
 * dump the object page table
 */
static void dmp_obj_page( object_record obj )
/*******************************************/
{
    unsigned_32     j;
    unsigned_32     offset;
    map_entry       map;

    if( Form == FORM_LX ) {
        offset = ( obj.mapidx-1 ) * sizeof( lx_map_entry );
    } else {
        offset = ( obj.mapidx-1 ) * sizeof( le_map_entry );
    }
    offset += New_exe_off + Os2_386_head.objmap_off;
    for( j = 0; j < obj.mapsize; ++j ) {
        Data_count++;
        Wdputs( "    page # " );
        Putdec( Data_count );
        Wdputs( "  map page = " );
        switch( Form ) {
        case FORM_LE:
            Wlseek( offset );
            Wread( &map, sizeof( le_map_entry ) );
            offset += sizeof( le_map_entry );
            Puthex( map.le.page_num[0], 2 );
            Puthex( map.le.page_num[1], 2 );
            Puthex( map.le.page_num[2], 2 );
            Wdputs( "H flgs = " );
            Puthex( map.le.flags, 2 );
            Wdputs( "H " );
            Wdputs( map_flgs[ map.le.flags ] );
            if( Options_dmp & OS2_SEG_DMP ) {
                Dmp_le_page_seg();
            }
            break;
        case FORM_LX:
            Wlseek( offset );
            Wread( &map, sizeof( lx_map_entry ) );
            offset += sizeof( lx_map_entry );
            Puthex( map.lx.page_offset, 8 );
            Wdputs( "H size = " );
            Puthex( map.lx.data_size, 4 );
            Wdputs( "H flgs = " );
            Puthex( map.le.flags, 2 );
            Wdputs( "H " );
            Wdputs( map_flgs[ map.lx.flags ] );
            if( Options_dmp & OS2_SEG_DMP ) {
                Dmp_lx_page_seg( map );
            }
            break;
        }
        Wdputslc( "\n" );
    }
}

/*
 * dump the object flag word
 */
static void dmp_obj_flags( unsigned_32 flags )
/********************************************/
{
    char    name[256];

    name[0] = 0;
    if( flags & OBJ_READABLE ) {
        strcat( name, "READABLE|" );
    }
    if( flags & OBJ_WRITEABLE ) {
        strcat( name, "WRITABLE|" );
    }
    if( flags & OBJ_EXECUTABLE ) {
        strcat( name, "EXECUTABLE|" );
    }
    if( flags & OBJ_RESOURCE ) {
        strcat( name, "RESOURCE|" );
    }
    if( flags & OBJ_DISCARDABLE ) {
        strcat( name, "DISCARDABLE|" );
    }
    if( flags & OBJ_SHARABLE ) {
        strcat( name, "SHARED|" );
    }
    if( flags & OBJ_HAS_PRELOAD ) {
        strcat( name, "PRELOAD|" );
    }
    if( flags & OBJ_HAS_INVALID ) {
        strcat( name, "INVALID|" );
    }
    if( flags & OBJ_PERM_SWAPPABLE ) {
        strcat( name, "SWAPPABLE|" );
    }
    if( flags & OBJ_PERM_RESIDENT ) {
        strcat( name, "RESIDENT|" );
    }
    if( flags & OBJ_PERM_LOCKABLE ) {
        strcat( name, "PERM_LOCKABLE|" );
    }
    if( flags & OBJ_ALIAS_REQUIRED ) {
        strcat( name, "16:16_ALIAS|" );
    }
    if( flags & OBJ_BIG ) {
        strcat( name, "BIG|" );
    }
    if( flags & OBJ_CONFORMING ) {
        strcat( name, "CONFORMING|" );
    }
    if( flags & OBJ_IOPL ) {
        strcat( name, "IOPL|" );
    }
    if( name[strlen(name)-1] == '|' ) {
        name[strlen(name)-1] = 0;
    }
    Wdputs( name );
    Wdputslc( "\n" );
}

/*
 * dump the LE/LX object table
 */
static void dmp_obj_table( void )
/*******************************/
{
    unsigned_16     i;
    object_record   os_obj;

    Banner( "Object Table" );
    for( i = 0; i < Os2_386_head.num_objects; i++ ) {
        Wlseek( New_exe_off + Os2_386_head.objtab_off
                            + i * sizeof( object_record ) );
        Wread( &os_obj, sizeof( object_record ) );
        Wdputs( "object " );
        Putdec( i + 1 );
        Wdputs( ": " );
        Dump_header( &os_obj.size, os2_obj_msg );
        Wdputs( "          flags = " );
        dmp_obj_flags( os_obj.flags );
        if( Options_dmp & PAGE_DMP ) {
            dmp_obj_page( os_obj );
        }
        Wdputslc( "\n" );
    }
}

/*
 * Dump the 386 Executable Header, if any.
 */
bool Dmp_386_head( void )
/***********************/
{
    Wlseek( New_exe_off );
    Wread( &Os2_386_head, sizeof( Os2_386_head ) );
    if( Os2_386_head.signature == OSF_FLAT_SIGNATURE ) {
        Form = FORM_LE;
        Banner( "Linear EXE Header (OS/2 V2.x) - LE" );
    } else if ( Os2_386_head.signature == OSF_FLAT_LX_SIGNATURE ) {
        Form = FORM_LX;
        Banner( "Linear EXE Header (OS/2 V2.x) - LX" );
    } else {
        return( 0 );
    }
    Wdputs( "file offset = " );
    Puthex( New_exe_off, 8 );
    Wdputslc( "H\n" );
    Wdputslc( "\n" );
    Dump_header( (char *)&Os2_386_head.byte_order, os2_386_msg );
    dmp_mod_flag_lx( Os2_386_head.flags, Os2_386_head.os_type );
    dmp_obj_table();
    Dmp_resrc2_tab();
    Dmp_le_lx_tbls();
    return( 1 );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?